簡體   English   中英

在C中使用rand()生成大量雙精度時發生分段錯誤

[英]Segmentation fault occurs when generating large amounts of doubles with rand() in C

根據gdb,這條線會導致分段錯誤

((double) rand()/(double) (RAND_MAX)) * (r*2)

但這完全沒問題

((float) rand()/(float) (RAND_MAX)) * (r*2)

我可以用花車湊合,但這讓我很煩惱。 我做錯了什么還是rand()無法處理雙打。

請注意,在上例的上下文中,所有出現的float都更改為double

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct cord {
    /* float or double */
    float x;
    float y;
};

int main() {
    float r = 3.0;
    int amount = 1000000;
    struct cord cords[amount];

    srand(time(NULL));
    for (int i = 0; i < amount; i++) {

        cords[i] = (struct cord) {
            /* Segfault occurs when (float) is replaced with (double) */
            ((float) rand()/(float) (RAND_MAX)) * (r*2),
            ((float) rand()/(float) (RAND_MAX)) * (r*2)
        };

    }
}

在發生段錯誤時,沒有更多的堆棧空間來分配新的double值。 下一個雙精度值的位置將位於非法(越界)內存地址,因此是段錯誤。

您的代碼不會為float的原因是因為浮點數是單精度的,並且與雙精度數(通常為 8B)相比,通常需要一半的字節數(通常為 4B)來存儲。 您的代碼仍然有足夠的空間來存儲所有的浮點數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM