0

何が悪いのか教えてください。

2D 動的配列の作成: ポインターの配列を作成し、各ポインターごとにブロックを割り当てました。

コードは次のとおりです。

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

int main()
{
    int i, j;
    int **a = NULL;

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

    if ( NULL == a)
    {
        printf("Failed to allocate memory.");
        return 1;
    }

    for ( i = 0; i < 10; i++ )
        a[i] = (int *)malloc(10*sizeof(int ));

    for ( i = 0; i < 5; i++ )
    {
        for ( j = 0; j < 10; j++ )
            a[i][j] = i*j;
    }

    for ( i = 0; i < 5; i++ )           // While running it prints this array. But...
    {                                   
        for ( j = 0; j < 10; j++ )
            printf("%4d", a[i][j]);
        printf("\n");
    }

    /* Trying to free allocated memory. */
    for ( i = 0; i < 5; i++ )           // ... sometimes app crashes around here.
    {
        free(a[i]);
    }

return 0;
}

このような未定義の動作の理由はわかりません...

4

2 に答える 2

4

この行

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

整数のリストへの 5 つのポインターに十分なスペースを作成します

それからあなたは書く

for ( i = 0; i < 10; i++ )
   a[i] = (int *)malloc(10*sizeof(int ));

10個使おうとしているところ!

したがって、未定義の動作。10 を 5 に変更するか、正しい量のスペースを割り当ててください

于 2013-04-11T17:31:43.863 に答える
2

Ed Heal と Mat が問題の場所を教えてくれるので、この問題が二度と起こらないようにする方法を教えてください。

コードで「マジック ナンバー」を使用しないでください。

割り当てるときは、サイズを変数に入れ (数値を正確に 1 回使用)、サイズが必要な場所でその変数を使用します。

int an = 5;
a = (int **)malloc(an * sizeof(int *));

...

for ( i = 0; i < an; i++ )
   a[i] = (int *)malloc(10*sizeof(int ));

Ed が私に思い出させてくれたように、それは変数である必要はありません。プリプロセッサ マクロを使用できます。

#define AN 5

または、 を使用することもできますenum

enum { AN = 5 };

これらの 2 つのオプションは、数値が定数である場合に一般的に適しています (変数は変化するもの用です)。

于 2013-04-11T17:35:47.913 に答える