我惊呆了,为什么这段代码会给我一个分段错误?
#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 :现在我知道网站名称代表什么了:)我让数组全局化,现在一切正常。
答案 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);