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

我正在尝试创建一个二维数组,其中每个坐标都随机分配1或0。 它工作得很好,直到它到达坐标[20] [3]。 之后,它只是抛出“分段错误11”。

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

#include  #include  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; } 

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

 int grid [x][y] 

循环播放

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

如果是一个接一个 。 ( 注意<=部分 )。

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

您应该将循环条件更改为i < xj < y以保持边界。 访问超出范围的内存会导致未定义的行为 。

那说,

  • int main()应该是int main(void) ,至少要符合托管环境的C标准。
  • 这里不需要将grid作为VLA。 如果已知维度,则更好的方法是使用编译时常量( #define )来生成数组维度。

你正在超越数组的边界 。 这是C中未定义的行为 ,并表现为崩溃。

i <= x更改为i < x等,或增加网格大小。