1

2 次元配列を作成するために calloc と malloc を使用しようとしています。これまでの私のロジックは、最初に calloc で整数ポインターの配列を作成し、次に malloc を使用して 2 番目の次元を作成することでした。これは私のコードです:

enter code here


    #include<stdio.h>
    #include<stdlib.h>

    int main()
    {
        int N,M,i=0,j=0;

        printf("Give the dimensions");
        scanf("%d%d",&N,&M);
        printf("You gave N: %d and M: %d\n",N,M);

        int **a=(int**)calloc(N,sizeof(int*));

        for(i=0; i<N; i++)
        {
            a[i]=(int*)malloc(M*sizeof(int));
        }

        printf("The array that was created resigns on addresses\n");
        for(i=0; i<N; i++)
        {
            for(j=0; j<M; j++)
            {
                printf("addr: %p\n",a[i,j]);
            }
        }
    }

これで、必要な配列を確実に作成したいと思います。次元 N=2 と M=2 (単なる例) を指定すると、次のアドレスを取得します (例): (0,0): 0x00001、(0,1):0x00003、(1,0): 0x00001、(1 ,1): 0x00003。したがって、2 次元配列ではなく、位置が 2 つしかない単純な配列を取得します。私のコーディングミスを指摘してもらえますか? 見つからない... :S

4

2 に答える 2

3

インデックス アクセス演算子の使い方が間違っています[]jコンマ演算子を使用しているため、i 番目の行と j 列にはアクセスしていませんが、要素のみにアクセスしています。

a[i,j] == a[j]

代わりに、特定の行にアクセスしてからセルにアクセスする必要があります。

a[i][j]

これはアドレスではなくint:を返すことに注意してください。

typeof a       == int **
typeof a[i]    == int *
typeof a[i][j] == int

それでもエントリのアドレスを知りたい場合は、&a[i][j]またはを使用する必要がありますa[i]+j

于 2013-01-03T20:43:06.443 に答える
2
printf("addr: %p\n",a[i,j]);

あれは

printf("addr: %p\n",a[j]);

そこでコンマ演算子を使用しています。

j番目の配列の 番目の要素にアクセスするには、次のiようにします。

a[i][j]

しかし、intそれはポインターではなくヒアであるため、変換printfで未定義の動作が呼び出されます。%p

于 2013-01-03T20:43:14.493 に答える