试图在循环中访问数组元素会导致分段错误,为什么?
我正在尝试创建一个二维数组,其中每个坐标都随机分配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
的数组,有效索引为0
到p-1
,包括0
和p-1
。
您应该将循环条件更改为i < x
和j < y
以保持边界。 访问超出范围的内存会导致未定义的行为 。
那说,
-
int main()
应该是int main(void)
,至少要符合托管环境的C标准。 - 这里不需要将
grid
作为VLA。 如果已知维度,则更好的方法是使用编译时常量(#define
)来生成数组维度。
你正在超越数组的边界 。 这是C中未定义的行为 ,并表现为崩溃。
将i <= x
更改为i < x
等,或增加网格大小。