0

私は次のCコードを持っています:

int main(int argc, char *argv[])
{

    int n = argc - 1;
    int array[n];
    int m[n][n];

    int i = 0;
    for(i = 1; i<=n;i++)
    {    
             array[i] = atoi(argv[i]);
            printf("%d\n",array[i]);
    }   
    printf("array[4] = %d\n",array[4]);
    for(i = 1; i<=n;i++)
    {   
             m[i][i] = 0;
            printf("address of m[i][i] = %p\n",&m[i][i]);
    }   

    printf("value of array[4] =%d pointer = %p\n",array[4],&array[4]);

    for(i=1;i<=n;i++) printf("After %d\n",array[i]);

    return 0;
}

次のコマンドで実行した場合: "./program 30 35 15 5 10 20 15" 出力は次のとおりです。

30
35
15
5
10
20
25
array[4] = 5
address of m[i][i] = 0xbf93070c
address of m[i][i] = 0xbf93072c
address of m[i][i] = 0xbf93074c
address of m[i][i] = 0xbf93076c
address of m[i][i] = 0xbf93078c
address of m[i][i] = 0xbf9307ac
address of m[i][i] = 0xbf9307cc
value of array[4] =0 pointer = 0xbf9307cc
After 30
After 35
After 15
After 0
After 10
After 20
After 25

array[4] が m[n][n] と同じポインタを持っていることに注意してください。そして、私はこれがどのように可能であるかを本当に理解していません。コードの何が問題なのですか。array[4] = m[n][n] となるのはなぜですか?

4

2 に答える 2

1
for(i = 1; i<=n;i++)
{   
         m[i][i] = 0;
        printf("address of m[i][i] = %p\n",&m[i][i]);
}   

m 用に予約されていないスペースを上書きしました。

私は0からn-1に行くべきです

for(i = 0 ; i < n ; i++)
{   
         m[i][i] = 0;
        printf("address of m[i][i] = %p\n",&m[i][i]);
}   
于 2013-02-11T00:33:43.683 に答える
1

ループが間違っています。配列Cはゼロベースです。a[0]最初の要素が、最後の要素が配列のサイズであることa[N-1]を意味します。N

これ:

for(i = 1; i <= n; i++)

これでなければなりません:

for(i = 0; i < n; i++)

そうしないと、配列の境界を超えてしまいます。

C99補足として、VLA を使用していますが、タグを指定していません。あなたが何をしているのかを知っていることを確認してください。

于 2013-02-11T00:34:04.673 に答える