0

char** に十分なメモリを割り当てる必要があります。gdb を使用して、セグメンテーション違反のポイントを見つけました。私はこの部分で約1時間立ち往生しており、セグメンテーション違反の理由がわかりません。

プログラムの出力:

サイズ: 10, 20

開始: 1、1

終了: 10, 20

セグメンテーション違反 (コアダンプ)

10 = m1.xsize
20 = m1.ysize
1 = m1.xstart
1 = m1.ystart
10 = m1.xend
20 = m1.yend

私のコードのスニペット:

typedef struct mazeStruct
{
    char** arr;
    int xsize, ysize;
    int xstart, ystart;
    int xend, yend;
} maze;



/* read in the size, starting and ending positions in the maze */
    fscanf (src, "%d %d", &m1.xsize, &m1.ysize);
    fscanf (src, "%d %d", &m1.xstart, &m1.ystart);
    fscanf (src, "%d %d", &m1.xend, &m1.yend);

    /* print them out to verify the input */
    printf ("size: %d, %d\n", m1.xsize, m1.ysize);
    printf ("start: %d, %d\n", m1.xstart, m1.ystart);
    printf ("end: %d, %d\n\n", m1.xend, m1.yend);

    //allocating memory for 2d char array
    m1.arr = (char**)malloc(m1.xsize+2 * sizeof(char*));

    for(i = 0; i < m1.xsize+2; i++)
        m1.arr[i] = (char*)malloc(m1.ysize+2);

    /* initialize the maze to empty */
    for (i = 0; i < m1.xsize+2; i++) <---- when i = 6 it seg faults
        for (j = 0; j < m1.ysize+2; j++)
            m1.arr[i][j] = '.';

十分なメモリを割り当てていませんか、それとも何が間違っていますか?

4

1 に答える 1

5

あなたの表現:

m1.xsize + 2 * sizeof(char*)

次と同等です。

(m1.xsize) + (2 * sizeof(char*))

演算子の優先順位のため、これはあなたが望むものではありません。代わりに次を使用する必要があります。

(m1.xsize + 2) * sizeof(char*)

例として、m1.xsize20 に設定し、ポインターのサイズが 4 バイトであるとします。したがって、88 バイトである 22 個のポインター用のスペースが必要です。この式m1.xsize + 2 * sizeof(char*)は、ポインタのサイズの 20 プラス 2 倍、合計 28 バイトを与えます。


余談ですが、malloc()特定の微妙なエラーを隠すことができるため、戻り値のキャストも停止する必要があります。C は、void*返された frommalloc()を他の任意のポインター型に暗黙的にキャストすることが完全に可能です。

于 2013-03-06T06:36:31.960 に答える