Sam*_*din 0 c memory arrays printf exc-bad-access
我很难过.我正在粘贴下面的程序.
void printGrid(int n,char grid[n][n]){
for(int i = 0; i<n ; i ++) {
printf("\n%s",grid[i]);
}
}
int main() {
char grid[6][6]= {"-----","-----","-----","-----","-----"};
printGrid(5, grid);
for(int i = 0; i<5 ; i ++) {
printf("\n%s",grid[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
-----
-
--
---
-----
-----
-----
-----
-----
Run Code Online (Sandbox Code Playgroud)
为什么同一个for循环在函数外部和内部产生不同的输出printGrid?
您正在使用VLA,但其大小与您传入的数组的大小不匹配.当您有一个数组时:
char a[m][n];
Run Code Online (Sandbox Code Playgroud)
char at a[x][y]基本上是由a + x*m + y.而且,你在内存中创建的数组的布局如下所示:
-----\0-----\0-----\0-----\0-----\0-----\0
Run Code Online (Sandbox Code Playgroud)
但是因为你的第一个维度是5而不是6,所以当你为每一行编制索引时,你会像这样:
-----\0-----\0-----\0-----\0-----\0-----\0
^ | | | | | |
^ | | | | |
^ | | | |
^ | | |
^ | |
^ |
^
Run Code Online (Sandbox Code Playgroud)
(你的循环实际上并不打印最后两个).如果您改为称之为:
printGrid(6, grid);
Run Code Online (Sandbox Code Playgroud)
你会看到输出更符合你的预期,因为大步前进.另一个循环应该也可以使用6.