试图在循环中访问数组元素会导致分段错误,为什么?

时间:2016-09-05 14:33:28

标签: c arrays segmentation-fault

我正在尝试创建一个二维数组,该数组随机分配给每个坐标1或0。它工作得很好,直到它到达坐标[20] [3]。之后它就抛弃了#34;分段故障11"。

我绝对不知道如何或为何。特别是因为我可以创建一个200 * 200的矩阵,但它仍然只在坐标[200] [3]处得到相同的问题。所以它总是在最后一个x坐标中出现错误的第三个y坐标。

#include <stdio.h>
#include <stdlib.h>

int main() {

  int x, y, i, j ;
  x = 20;
  y = 20;

  int grid [x][y];

  for ( i = 0; i <= x; i++) {
    for ( j = 0; j <= y; j++) {

      grid[i][j] = rand() % 2 ;

      printf("grid [%d][%d]: %d\n", i, j, grid[i][j]);

    }
  }
  return 0;
}

2 个答案:

答案 0 :(得分:2)

您正在运行数组的 bounds 。这是C中的未定义行为,并且表现为崩溃。

i <= x更改为i < x等,或者增加网格尺寸。

答案 1 :(得分:2)

C对数组使用基于0的索引。因此,对于定义为

的数组
int grid [x][y]

循环

 for ( i = 0; i <= x; i++) 
   for ( j = 0; j <= y; j++)

如果off-by-one。 (注意<=部分)。

详细说明,对于维度p的数组,有效索引为0p-1,包括i < x

您应该将循环条件更改为j < yint main()以保持边界。访问超出范围的内存会导致undefined behavior

那就是说,

  • int main(void)至少应为grid,以符合托管环境的C标准。
  • 此处无需将#define作为VLA。如果已知维度,则更好的方法是使用编译时常量(ValueAnimator mValueAnimator = new ValueAnimator(); )来生成数组维度。