2

私はこれをずっと見つめていたので、すべてが一緒に実行され始めています。
だから私はvalgrindエラーが発生しています:

==25468== Invalid write of size 4
==25468==    at 0x52CF64D: _IO_vfscanf (vfscanf.c:1857)
==25468==    by 0x52D730A: __isoc99_fscanf (isoc99_fscanf.c:35)
==25468==    by 0x402DDB: loadMindRAW (gplib.c:172)
==25468==    by 0x4047EE: loadAgent (gplib.c:739)
==25468==    by 0x4048BD: loadAgentsFromFile (gplib.c:799)
==25468==    by 0x4010C3: initRound (gpfight.c:220)
==25468==    by 0x400EBE: main (gpfight.c:99)
==25468==  Address 0x584388d is 253 bytes inside a block of size 256 alloc'd
==25468==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

そして、これが犯罪者です:

void loadMindRAW(FILE* f_file, unsigned char* mind)
{
    int i;
    for(i=0; i < MIND_SIZE; i++)
    {
        fscanf(f_file,"%d,",&(mind[i]));
    }
}

着信する符号なし文字配列は直前にmallocされました:(MIND_SIZEは256です)

tmpAgent->mind = malloc(MIND_SIZE*sizeof(unsigned char));
loadMindRAW(f_file, tmpAgent->mind);

心のアドレスを正しく指し示していますか?&(mind[i])少しぎこちないようでした。生のポインタ操作mind+iは、同じ動作をします。ここで簡単なものが欠けていますか?

4

1 に答える 1

4

アドレスを正しく指していますが、ポインターを期待する位置にunsigned charポインターを渡すことはできません。これは、指定子が表示されるためです。可変引数リスト内の対応する位置が signed へのポインターであると想定しています。varargs が C および C++ で実装されているため、他の方法はありません。fscanfintfscanf%dintfscanf

ループを書き直す方法は次のとおりです。

for(i=0; i < MIND_SIZE; i++)
{
    int tmp;
    fscanf(f_file,"%d,",&tmp);
    mind[i] = (unsigned char)tmp;
}
于 2012-05-20T19:27:22.057 に答える