相同的代码在C中提供不同的输出

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

Fat*_*ror 5

您正在使用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.