0

我被这件事难住了。我正在粘贴下面的程序。

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

4

1 回答 1

5

您正在使用 VLA,但大小与您传入的数组的尺寸不匹配。当您有一个数组时:

char a[m][n];

at 的字符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

于 2013-03-20T12:08:05.093 回答