根据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)
};
}
}
答案 0 :(得分:3)
在发生segfault时,没有更多的堆栈空间来分配新的double
值。下一个double的位置将是非法(越界)内存地址,因此是段错误。
你的代码没有float
的段错误的原因是因为浮点数是单精度的,并且通常需要存储的字节数的一半(通常为4B)与双精度相比(通常是8B)。您的代码仍有足够的空间来存储所有浮动。