使用c中的rand()生成双精度时出现分段错误

时间:2018-04-28 19:11:56

标签: c random floating-point segmentation-fault double

根据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)
        };

    }
}

1 个答案:

答案 0 :(得分:3)

在发生segfault时,没有更多的堆栈空间来分配新的double值。下一个double的位置将是非法(越界)内存地址,因此是段错误。

你的代码没有float的段错误的原因是因为浮点数是单精度的,并且通常需要存储的字节数的一半(通常为4B)与双精度相比(通常是8B)。您的代码仍有足够的空间来存储所有浮动。