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];

の文字a[x][y]は、基本的に。によって検出されa + x*m + yます。さらに、メモリ内に作成した配列のレイアウトは次のようになります。

-----\0-----\0-----\0-----\0-----\0-----\0

ただし、最初のディメンションは6ではなく5であるため、各行にインデックスを付けると、次のようにヒットします。

-----\0-----\0-----\0-----\0-----\0-----\0
^     |    |     |     |     |     |
      ^    |     |     |     |     |
           ^     |     |     |     |
                 ^     |     |     |
                       ^     |     |
                             ^     |
                                   ^

(ループは実際には最後の2つを出力しません)。代わりに次のように呼び出す場合:

printGrid(6, grid);

ストライドが並んでいるため、出力が期待どおりになっていることがわかります。他のループもおそらく使用しているはず6です。

于 2013-03-20T12:08:05.093 に答える