私はポインタchar型のAを2倍に新しい長さををmallocと仮定し、古い配列B.。この:A
で開催されたアドレスにB
に保持されたアドレスから
memcpy(A, B, oldLen);
単にコピーoldLen
バイト。あなたのアイテムが1バイトの大きさでなければ(それはポインタではありません)、カウントは小さすぎます。あなたは同じコードで前malloc
呼び出しでやったのと同じように、アイテムのサイズは、バイトサイズ計算に含まれている必要があります
memcpy(A, B, oldLen * sizeof (char*));
最後に、あなたはこのコード
char **newArray(char **B, int oldLen, int newLen)
{
char **A = realloc(B, newLen * sizeof(char*));sizeof(char*));
if(A == NULL)
{
// Note: B is still valid here. What you want to do with it
// including nothing, is up to you. Your current logic just
// terminates the process, so we leave it alone and just exit.
perror("Failed to allocate");
exit(1);
}
return A;
}
を簡素化するために
realloc
を使用することができます
実装のメモリマネージャがシーケンスを拡張する必要がある場合は、古いバッファから新しいバッファへのすべてのコピーを実行し、古いバッファを解放します。しかし、追加の利点があります。
最新のダイナミックメモリマネージャのほとんどは固定割り当てページサイズです。例えば、あなたが要求する割り振りがどれほど小さいかに関わらず、アロケータは16バイトの最も近い倍数に切り上げることができます。もちろん、リクエストしたサイジングを記憶していますが、内部には容量もあります。 realloc
への新たに拡張されたスペース要求が既存の容量内に「適合」しても、実際の再割り当ては必要ありません。その代わりに、インプリメンテーションは現在の割り当ての "使用された"大きさを単に更新して、現在多くの容量が使用されており、と同じポインタが返されることに注意することができます。これにより、より効率的なメモリ管理が促進され、小さいチャンクであれば大幅に高速化することができます。
ちょっと考えてください。
'oldLen * sizeof(* A)'。あなたはすでにあなたの割り当てについて正しい数学をしました。あなたの 'memcpy'でもやってみませんか?または、より良い方法として、代わりに 'realloc'を使用します。 – WhozCraig
@ n.m。彼は文字の配列をコピーするのではなく、ポインタの配列をコピーしています。 –
@WhozCraigあなたは 'memcpy(A、B、oldLen * sizeof(* A));'を意味しますか?私は長い間memcpyを使う方法を見てきました。void * memcpy(void * dest、const void * src、size_t n)に気付きました。どのようにmemcpyを使用するのですか...私はちょうどAとBがダブルポインタの場合、私はmemcpyを使って配列ポインタを別のものにコピーすることもできますか? – HxH