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