2016-10-06 6 views
0

配列Bから配列Aを指し、次にAを解放することにより、2つの配列をCでスワップしようとしています。これは可能ですか?配列AからCの配列Bを指すようにポインタを設定するには

コード:

for (size_t i = 0; i < 4; i++) 
    b[i] = a[i]; 

注:常にためmalloc()の戻り値をチェックし

int *a = malloc(4*sizeof(int)); 
a[0] = 1; 
a[1] = 2; 
a[2] = 3; 
a[3] = 4; 
int *b = malloc(4*sizeof(int)); 
//Assign pointer from b to memory position of a so b[] = a[]? 

あなたはループを使用することができます

はWouter

+1

お勧め 'int * a = malloc(4 * sizeof(* a));' - どちらのバージョンも正しいですが、このように書くと間違いを起こす可能性は少し低くなります。 –

+0

あなたは何をしようとしているのか分かりません。内容をまったくコピーするか、ポインタをコピーするだけですか? –

答えて

0

、事前にありがとう失敗。

4
#include <string.h> 

#define ARRAY_LENGTH 4 

// insert your code above here.. and as the other answer says you should 
// always check malloc's return value to make sure it succeeded before 
// continuing or you will seg fault. If it fails, you should gracefully 
// handle the error 

memcpy(b, a, sizeof(int) * ARRAY_LENGTH); // copies sizeof(int)*ARRAY_LENGTH bytes 
              // from the memory space pointed to by a 
              // to the memory space pointed to by b 
free(a); // returns the memory pointed to by a to the heap 

詳しい情報は、およそmemcpyhereを見つけることができます。メモリをコピーするための高度に最適化された機能です。 4つの値しか持っていない場合は、あなた自身のループのパフォーマンスの違い(memcpy)、または数千から何百万回も実行していない限り、手動で各値を手動で割り当てる(ループをアンロールする)ことはできません。

親指の一般的なルールとして、できるだけ控えめにmallocを使用したいと思います。実行するまでに必要なメモリ量がわからない場合や、メモリの範囲を関数の外に維持したい場合は、使用する必要があります。メモリを誤って管理することは、大規模なプログラムでは追跡が困難な多くのバグの原因です。なぜなら、同じ場所で同じ時間に常に同じ時間に自分自身を明示するわけではないからです。ここでは、自分が行っていることを正確に知るための十分なコードを表示していません。しかし、配列のサイズを事前に知っているので(4 int)、関数外でこれらの配列が必要な場合を除き、ほとんどのシステムではスタック上に配置してください:

int a[4]; 
int b[4]; 
// perform assignment to a 
// perform copy to b 
// do work on data 
// .... 
// now when the function ends, these arrays will automatically get destroyed, saving you the trouble 

a配列をコピーする正当な理由があることをあなたの言葉でお伝えします。コードからはわかりません。 )

は最後に、これはだまされやすい人だったと私たちのどちらもがそれに答えたはず:) How to copy one integer array to another

+0

あなたの答えにいくつかの詳細を追加できますか?多分説明の1つまたは2つの文:) –

+1

@アンドレアスグレンチェン完了! – yano

0

あなたはmalloc関数と、ヒープ上のアレイを、(作成する場合は、他のどのようなものであるポインタを取得それが割り当てられてもコピーされてもよいという点で異なる。ただし、メモリバッファは1つしかありません。

よう

int *a = malloc(n * sizeof(int)); 
int *b = a; 

は、メモリの同じ領域にAとB点との両方を意味します。これはポインタエイリアシングと呼ばれ、実行していることを厳密に制御しなければ深刻な問題を引き起こします。一般に、バッファを指している場合は、それを識別するためにaを使用する必要があります。コピーは私たちには役に立たない。

我々は、

int *a = malloc(n * sizeof(int)); 
int *b = malloc(n * sizeof(int)); 

あなたの例のように、我々は二つのバッファを持っている場合。したがって、b = aを代入すると、bはaのバッファを指し、bが指しているバッファは孤立します。もう一度、私たちが望むものではありません。私たちはこの

int *a = malloc(n * sizeof(int)); 
int *b = malloc(n * sizeof(int)); 
int * temp' 

temp = a; 
a = b; 
b = temp 

をすれば

しかし我々は、AとBを入れ替えています。 bは、以前に指し示されたバッファaを指し、今は、以前に指し示されたバッファbを指す。

これは問題ありません。そして時折、それを行うことは賢明です。

関連する問題