我很难过。我正在粘贴下面的程序。
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;
}
输出:
-----
-
--
---
-----
-----
-----
-----
-----
为什么相同的for
循环在函数printGrid
外部和内部产生不同的输出?
答案 0 :(得分:5)
您正在使用VLA,但其大小与您传入的数组的尺寸不匹配。当您有一个数组时:
char a[m][n];
a[x][y]
处的字符主要由a + x*m + y
找到。而且,你在内存中创建的数组的布局如下所示:
-----\0-----\0-----\0-----\0-----\0-----\0
但是因为你的第一个维度是5而不是6,所以当你为每一行编制索引时,你会像这样:
-----\0-----\0-----\0-----\0-----\0-----\0
^ | | | | | |
^ | | | | |
^ | | | |
^ | | |
^ | |
^ |
^
(你的循环实际上并不打印最后两个)。如果您改为称之为:
printGrid(6, grid);
你会看到输出更符合你的期望,因为步幅排队。另一个循环可能也应该使用6
。