6

たとえば、次のような関数が必要です。

char *dst = (char*)malloc(512);
char *src = (char*)malloc(1024);
...
dst = (char*)realloc(dst, 1024);
memcpy(dst, src, 1024);

ご覧のとおり、関数 realloc() でバッファーのサイズを拡張したいだけですが、C ライブラリの realloc() は古いアドレスからデータをコピーする可能性があります。それで、私が望むようなライブラリに関数はありますか?

4

3 に答える 3

4

それだけではない理由:

free(dst);
dst = malloc(1024);

また、 はブロックをサイズ変更するだけでなく移動する可能性があるため、 への以前の呼び出しによって返された古いポインタを保持するか、同じチャンクを参照しなくなる可能性があることに注意しreallocてください。malloccallocrealloc

于 2011-07-14T15:47:52.777 に答える
2

realloc試みはコピーせずにバッファを拡張しますが、余分なスペースが空いている場合にのみそれを行うことができます.

あなたの場合、スペースを割り当てたばかりでsrc、そのメモリブロックreallocが必要なスペースを使用した可能性があります。その場合、より大きなブロックを別の場所に割り当てて、データをそのブロックにコピーすることしかできません。

于 2011-07-14T15:57:25.913 に答える
0

それで、私が望むようなライブラリに関数はありますか?

いいえ、ありません。余裕がない場合、システムはどのようにメモリの一部を拡張することになっていますか?

たとえば、これを行うと想像してください:

char *a = malloc(2);
char *b = malloc(2);

割り当てられたメモリは次のようになります。

1 2 3 4 5 6 7
-------------------------
| | | | | | | | | | | | | |
-------------------------
\ /\ /\ /        
 \ / \ / \ /
   vvv
 メモリ未使用/メモリ
 「a」の場合は「b」の場合は内部
         メモリーピース

今、あなたはそうしますrealloc(a,10);。システムは、"a" のメモリ ピースを単純に拡張することはできません。「b」で使用されるメモリにヒットするため、代わりに、10 連続する空きバイトがあるメモリ内の別の場所を見つけ、古いメモリ ピースから 2 バイトをコピーして、これらの新しい 10 バイトへのポインタを返す必要があります。 .

于 2011-07-14T16:05:39.093 に答える