数组绑定违规:不同索引的段错误

时间:2017-07-28 08:41:27

标签: arrays memory-management segmentation-fault indexoutofboundsexception

为什么这个程序每次都会对i的不同值进行分段?

#include <stdio.h>
int main() {

  int a[16], i = 0; 
  while(1) {  
    a[i] = i;
    printf("%d\n", a[i]);
    i++;
  }
}

1 个答案:

答案 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