2

2Dアレイを作成しましたが、失敗し、「lab10.exeの0x77a415deで未処理の例外:0xC0000374:ヒープが破損しています」というメッセージが表示されます。ここからどこに行くのか、どのようにデバッグするのかわからない。配列のサイズやmalloc()の使用と関係があると思います。よろしくお願いします!

//Get the number of Columns from the user
printf("Enter the number of rows and columns:\n");
scanf("%d", &dimension);

//Allocate 1-D Array of Pointers, Array 'a'
a = (int** ) malloc( sizeof(int)*dimension);
if(a == NULL)
{
    printf("\nError Allocating Memory");
    exit(1);
}

//Allocate Rows for 2-D Array; Array 'a'
for(r = 0; r < dimension; r++)
{
    a[r] = (int*) malloc( sizeof(int) * dimension);
    if (a[r] == NULL)
    {
        for(i = 0; i< r; i++)
            free(a[i]);
        printf("\nError Allocating Memory");
        exit(1);
    }
}

もっとありますが、私はこれを同じ整数の「次元」から4回行います。ありがとうございました!

4

5 に答える 5

2

この行は間違っています:

a = (int** ) malloc( sizeof(int)*dimension);

dimensionタイプの要素の配列に十分なスペースを割り当ててintいますが、それをの配列として使用していますint*。64ビットプログラムをコンパイルしている場合、sizeof(int*)は8ですsizeof(int)が4であるため、十分なスペースを割り当てていません。あなたは使用する必要がありますsizeof(int*)

a = (int** ) malloc( sizeof(int*)*dimension);
//                          ^^^^^
于 2012-11-08T21:04:56.420 に答える
2

スニペット内

//Allocate 1-D Array of Pointers, Array 'a'
a = (int** ) malloc( sizeof(int)*dimension);

コメントが実際のコードと一致しません。dimensionコードでは、ポインターではなく整数用のスペースを割り当てています。

ポインタはintよりも大きい可能性が高いため、行を割り当てるループは割り当てられたメモリの外に出ます。

初期割り当ては次のようになります

a = malloc( sizeof(int*)*dimension);

また

a = malloc( dimension * sizeof *a);

2番目の形式には、サイズの任意の配列を割り当てるために常に正しいという利点がありますdimension

于 2012-11-08T21:05:17.740 に答える
2

初め:

a = (int** ) malloc( sizeof(int)*dimension);

ポインタの配列を割り当てているため、次のことが必要です。

a = (int** ) malloc( sizeof(int*)*dimension);

intとint*のサイズが同じであるとは限りません。

2番:

if (a[r] == NULL)
{
    for(i = 0; i< r; i++)
        free(a[i]);
    printf("\nError Allocating Memory");
    exit(1);
}

すべての行のメモリを解放しますが、「a」自体のメモリは解放しません。

于 2012-11-08T21:11:29.913 に答える
0

時間がかかり、最初の例をコンパイルすると、正常に実行されます。エラーはa、タイプである必要がある可能性がありますint **a。また、型ri変数を追加する必要があります。これが機能しない場合は、エラーの行を指定し、変数宣言とを追加する必要があると思います#includes。これがお役に立てば幸いです...

于 2012-11-08T20:22:59.410 に答える
0

エラーが見つかりました!私の他の'for'ループの1つにある無限forループでした!また、上記の多くの人が述べているように、私は(int)だけでなく(int *)を掛けるべきでした!どうもありがとう!

于 2012-11-08T21:30:35.953 に答える