2013-03-20 60 views
0

我被这个难住了。我正在粘贴下面的程序。相同的代码给C不同的输出

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

关键字:二维数组不是双指针。 – 2013-03-20 11:53:16

+3

请注意,“----- \ 0”实际上是7个字节(每个字符串文字会自动添加'\ 0')。另外,'grid'数组是'6x6',你告诉'printGrid','grid'是'5x5',这是完全不同的。 – 2013-03-20 11:54:53

+1

H2CO3详细说明? Kiril是的,我知道我只是把那里想到的其他东西。 – 2013-03-20 11:56:08

回答

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

+0

感谢人...我从来没有意识到dat d函数原型中指定的大小会影响它的索引。无论如何,这是在网站hackerrank主机编程难题的c模板中的错误。他们要求填写一些像(int size,int array [size] [size])这样的函数,但是在其他地方,它声明了不同的大小并传入。我从来没有想过他们的代码会有一个错误,我在这之后浪费了数小时..我上面贴的是一个简化版本。 TL DR:你解释的岩石! – 2013-03-20 12:22:53

相关问题