3

次のコードを検討してください。

char buffer[] = "abcdefghijklmnopqrstuvwxyz",
*val = malloc(10), *pbuf = buffer, *pval = val, *tmpbuf;

int size = 10,loaded = 0;

while(*pbuf) {

    if((loaded + 1) >= size) {
        size += 10;
        tmpbuf = realloc(val, size);

        if(tmpbuf != NULL) {
            val = tmpbuf;
            pval = val;
        } else {
            printf("realloc()\n");
            exit(-1);
        }
    }

    *pval ++= *pbuf ++;
    loaded ++;
}

*pval ++= '\0';
printf("%s\n", val);
free(val);

tuvwxyzの代わりに印刷しabcdefghijklmnopqrstuvwxyzます。

なんで?ドキュメントによると、によって返された新しいポインターはrealloc()、以前に渡されたバッファーを保持していません。

4

2 に答える 2

4

バッファを新しいバッファにコピーしています(同じでない場合)。問題は、バッファを上書きしていることです。"pval = val;" 書き込みポイントをバッファの最初のバイトに設定し、コンテンツを再配置します。「pval = val + loaded;」に変更してみてください。

于 2012-06-28T02:31:19.610 に答える
2

への呼び出しの後、reallocに再割り当てpvalval、 から に割り当てtmpbufます。つまり、 を呼び出すたびにreallocpval動的バッファの先頭へのポイントがリセットされます。

于 2012-06-28T02:31:54.350 に答える