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

时间:2013-03-20 11:50:02

标签: c arrays memory 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;
}

输出:

-----
-
--
---
-----
-----
-----
-----
-----

为什么相同的for循环在函数printGrid外部和内部产生不同的输出?

1 个答案:

答案 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