1

重複の可能性:
Cで多次元配列を正しく設定、アクセス、解放するにはどうすればよいですか?

callocを使用して2D配列にメモリを動的に割り当てようとしています。列は2に固定されているため、動的な行のみです。

これが私が試していることです:

unsigned int **pts, rows;
int main()
{
    //some code

    pts = (unsigned int **)calloc(2*rows, sizeof (unsigned int **));
}


//The code to access the array :
for(k=1;k<=i;k++)
{
    printf("\nX%d=",k);
    scanf("%d",&pts[k][0]);
    printf("\nY%d=",k);
    scanf("%d",&pts[k][1]);
}

しかし、問題は、配列にアクセスしているときにプログラムがクラッシュすることです。MinGWGCCでEclipseを使用しています。

これが私の最初の投稿なので、ここにさらにデータを入れる必要があるかどうか、またはこれに対処する方法を教えてください。

4

2 に答える 2

2

チューダーの答えは正しい解決策です。しかし、コードが間違っている理由についてもう少し洞察を提供するために...

あなたのコードが実際に行っているのは、int型へのポインタへのポインタの長さ2*行の配列を割り当てることです。

あなたが作成しようとしているのはこれです:

an array of int** -> int* -> int
                          -> int
                          -> int
                          -> ...more
                  -> int* -> int
                          -> int
                          -> int
                          -> ...more
                  -> int* -> int
                          -> int
                          -> int
                          -> ...more
                  -> ...more

実際に作成したものは次のとおりです。

an array of int** -> int* -> nothing (null address)
                  -> int* -> nothing...
                  -> ...more

次に、 int **の配列内のゼロで初期化されたint *の1つが指すnullアドレスの1つにintを割り当てようとします(callocは、すべてのint *がゼロであることを確認しています)

実行しようとしているとき

scanf("%d",&pts[k][0]);

pts [k]は、 int **の配列内の(k --1)番目の要素を参照しますが、上記のように、コードは実際にこの要素にスペースを割り当てていますが、ゼロとして初期化しています。したがって、このpts[k]はNULLを指します。したがって、scanfはNULLアドレスからのゼロオフセットに基づいてアドレスを取得しました...これが無効であることは明らかです。

于 2012-10-18T13:58:47.010 に答える
1

これを行う方法は次のとおりです。

pts = (unsigned int **)calloc(rows, sizeof (unsigned int *));
for(int i = 0; i < rows; i++) {
    pts[i] = (unsigned int *)calloc(2, sizeof (unsigned int));
}
于 2012-10-18T13:55:02.347 に答える