2016-11-06 17 views
1

私は関数が新しいスペースメモリを持つダブルポインタcharを返すと仮定します。ダブルポインタcharを別のダブルポインタcharにコピーするには?あなたがコピーされている項目のあなたの順序で項目のバイトサイズを逃しているダブルポインタのcharを別のダブルポインタcharにコピーする方法は?

char **newArray(char **B, int oldLen, int newLen){ 
    char **A = malloc(newLen * sizeof(char*)); 
    // if(A == NULL){ 
    // perror("Failed to allocate"); 
    // exit(1); 
    // } 
    memcpy(A, B, oldLen);//can copy memory from B to A? 
    free(B); 
    return A; 
} 
+2

'oldLen * sizeof(* A)'。あなたはすでにあなたの割り当てについて正しい数学をしました。あなたの 'memcpy'でもやってみませんか?または、より良い方法として、代わりに 'realloc'を使用します。 – WhozCraig

+0

@ n.m。彼は文字の配列をコピーするのではなく、ポインタの配列をコピーしています。 –

+0

@WhozCraigあなたは 'memcpy(A、B、oldLen * sizeof(* A));'を意味しますか?私は長い間memcpyを使う方法を見てきました。void * memcpy(void * dest、const void * src、size_t n)に気付きました。どのようにmemcpyを使用するのですか...私はちょうどAとBがダブルポインタの場合、私はmemcpyを使って配列ポインタを別のものにコピーすることもできますか? – HxH

答えて

1

私はポインタ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への新たに拡張されたスペース要求が既存の容量内に「適合」しても、実際の再割り当ては必要ありません。その代わりに、インプリメンテーションは現在の割り当ての "使用された"大きさを単に更新して、現在多くの容量が使用されており、と同じポインタが返されることに注意することができます。これにより、より効率的なメモリ管理が促進され、小さいチャンクであれば大幅に高速化することができます。

ちょっと考えてください。