3

奇妙な問題があり、どのようにアプローチすればよいかわかりません。

50x50文字のテキストファイルを読み取っていて、それを50x51動的配列に書き込みたい(51番目のスロットを「\ 0」で埋める)。

その後、アレイ全体をコンソールに印刷します。これが入力であるため、それぞれ50文字の50行が表示されます。

最初の行を除いて、それも非常にうまく機能します。何らかの理由で常に間違っています。

#define FIELD_SIZE 50
int main(int argc, char** args){
    char* data = ReadFile("start.txt");

    char** map = (char**) malloc( FIELD_SIZE );

    if(map==NULL)
        __debugbreak();

    {
        int i;
        for(i = 0; i < FIELD_SIZE; i+=1){
            map[i] = (char*) malloc(FIELD_SIZE+1);

            if(map[i]==NULL)
                __debugbreak();
            //(FIELD_SIZE+1) in order to skip the '\n' at the end of each line.
            memcpy( &map[i][0], &data[i*(FIELD_SIZE+1)], FIELD_SIZE);
            map[i][FIELD_SIZE] = '\0';
        }
    }


    {
        int i;
        for(i = 0; i < FIELD_SIZE; i+=1){
            printf("%s\n", map[i]); //<-- prints something bad for i==0
        }
    }

    free(data);

    return 0;
}

プログラム実行後のコンソールは次のようになります ここに画像の説明を入力してください 。最初の行も「aaaaaaaaaaaaa...」であると想定されています。だから、それは悪いポインタか何かのようです。

ただし、代わりにFIELD_SIZEを20に減らしている場合(およびそれぞれ20x20のテキストファイルを読み込んでいる場合)は正常に機能します。

ただし、配列サイズと最初のインデックスの関係が機能していないことはわかりません。mallocが0を返すことはないため、割り当てに問題はありません。

プログラムのコンパイルにVS2010C++を使用していますが、Cサブセットに制限する必要があります。

4

2 に答える 2

5

char ** map =(char **)malloc(FIELD_SIZE);

char ** map =(char **)malloc(FIELD_SIZE * sizeof(char *));

これがあなたのコードのバグであるかどうかはわかりません。50バイトを割り当てますが、マップに50バイトx4バイト/ポインターが必要です。

于 2012-05-17T19:26:29.350 に答える
0

すぐに気付くことがあります。この文脈ではおそらく役に立たないでしょう。Memcpyは、そのソースとして、参照された値ではなくポインターのアドレスを取得するため、通常は、このように使用しないでください。私が言えることから、あなたは一度に行をコピーしようとしていると言えます。

memcpy( map[i], &data[i*(FIELD_SIZE+1)], FIELD_SIZE);

おそらく問題を解決することはないでしょうが、それを試してみてください。

于 2012-05-17T19:23:37.107 に答える