![](/img/trans.png)
[英]segmentation fault while generating a number of random numbers using rand() in C
[英]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.