0
printf("\n enter your choice\n 1 to ask user for the size of game board\n 2 tp get input from a file\n");
scanf("%d",&choice);
if(choice==1)
{
    printf("\n enter number of rows and columns");
    scanf("%d%d",&row,&col);
    mat=(char**)malloc(row*sizeof(char));
    label=(char**)malloc(row*sizeof(char));
    for(i=0;i<row;i++)
    {
        mat[i]=(char*)malloc(col*sizeof(char));
        label[i]=(char*)malloc(col*sizeof(char));
    }

    for(i=0;i<row;i++)
    {

        for(j=0;j<col;j++)
        {
            temp=rand()%5;

            mat[i][j]=color_codes[temp];
            label[i][j]=' ';
        }

    }
}

この C 言語ステートメントは私のビジュアル スタジオ IDE では正常に動作していますが、CODE BLOCKS IDE で同じステートメントを実行しようとすると、突然クラッシュします。

4

3 に答える 3

2

malloc を実行するときに、間違った値で乗算するこのバグを回避する簡単な方法があります。

→ 必ず配列要素の型のサイズを掛けますsizeof(*var)

 char **mat;

 mat = malloc (row * sizeof(*mat));

こうすれば、二度と掛け算を間違えることはありません。もう 1 つの利点: の型を に変更することにしたmat場合double、変更する必要があるのは 1 か所だけです: その宣言です。

また、malloc の戻り値をキャストしないでください。SO why でハッシュ化されています。

于 2013-06-09T15:00:13.833 に答える
1

二行

mat=(char**)malloc(row*sizeof(char));
label=(char**)malloc(row*sizeof(char));

私には正気ではないように見えます。ポインターの配列をcharに割り当てようとしていますが、単純なcharのサイズのみを指定しています。通常、ポインターには 1 バイト以上が必要です。

したがって、おそらく必要なのは

mat=(char**)malloc(row*sizeof(char*));
label=(char**)malloc(row*sizeof(char*));

mallocin は任意の型に暗黙的にキャストできるためCvoid*結果を cat する必要はないことに注意してください。

そう

mat=malloc(row*sizeof(char*));
label=malloc(row*sizeof(char*));

もうまくいきます。

于 2013-06-09T14:51:45.250 に答える
1

十分なメモリを割り当てていません:

mat=(char**)malloc(row*sizeof(char));
label=(char**)malloc(row*sizeof(char));

配列内の各項目は char ( ) へのポインターchar*であるため、次のように乗算する必要がありますsizeof(char*)

mat=(char**)malloc(row*sizeof(char*));
label=(char**)malloc(row*sizeof(char*));
于 2013-06-09T14:49:09.540 に答える