为什么这个程序每次都会对i的不同值进行分段?
#include <stdio.h>
int main() {
int a[16], i = 0;
while(1) {
a[i] = i;
printf("%d\n", a[i]);
i++;
}
}
答案 0 :(得分:0)
我认为这与C分配内存的方式有关。当你使用
行int a[16]
你基本上说的是'在内存中分配足够的空间来容纳16个整数,从给定点开始(称为x
})。
然后当你说
while(1) {
a[i] = i;
printf("%d\n", a[i]);
i++;
}
您永远说,将ith
的{{1}}索引设置为a
并打印出来。这是通过从i
开始然后一次移动一个索引来工作的。对于前16个整数,这很好,因为你已经清理了空间来做到这一点。
然而,当你经过那个时,你还没有清理空间,所以你不知道那里有什么,你可以覆盖或打印什么。这可能会好一段时间,但是接下来你将无法覆盖内存中的内容(它不是免费的)。此时,您将获得x
。
每次运行程序时,您将在不同的位置分配空间,它将需要不同的迭代次数才能到达内存的位置,因此您将在不同的索引处segfault
。