代码之家  ›  专栏  ›  技术社区  ›  Ritielko

在C中使用rand()生成大量双精度时发生分段错误

  •  3
  • Ritielko  · 技术社区  · 6 年前

    根据 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 回复  |  直到 4 年前
        1
  •  3
  •   Ṃųỻịgǻňạcểơửṩ    6 年前

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

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