2013-03-20 61 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

相關問題