为什么会出现分段错误?

时间:2011-01-11 23:47:23

标签: c struct segmentation-fault

我惊呆了,为什么这段代码会给我一个分段错误?

#include <stdio.h>

#define LIMIT 1500000

typedef struct {
    int p;
    int a;
    int b;
} triplet;

int main(int argc, char **argv) { 
    int i;
    triplet triplets[LIMIT];

    for (i = 0; i < LIMIT; i++) {
        triplets[i].p = 9; // remove this line and everything works fine
    }

    printf("%d\n", triplets[15].p);

    return 0; 
}

编辑:将LIMIT更改为150后,我不再遇到分段错误,而是打印随机数。

EDIT2 :现在我知道网站名称代表什么了:)我让数组全局化,现在一切正常。

2 个答案:

答案 0 :(得分:10)

堆栈溢出!每个记录12个字节分配1500000条记录(假设为4字节int),需要超过17 MB的堆栈空间。使您的triplets数组全局或动态分配它。

关于你的编辑 - 缩小数组可能会阻止堆栈溢出,但你的printf()调用仍然会打印未初始化的数据 - triplets[15].p当时可能任何你把它打印出来。

答案 1 :(得分:4)

当你这样做时

triplet triplets[LIMIT];

你要在堆栈上分配它。这显然对你的系统来说太大了。

如果你这样做

triplet* triplets=(triplet*)malloc(LIMIT*sizeof(triplet));

你将它分配到堆上,一切都应该没问题。完成后请务必释放内存

free(triplets);