構造体に格納されているデータを別の構造体にコピーしたい。以下のコードは動作しますか?? 推奨されますか?
#define SIZE 100
struct {
int *a;
int *b;
} Test;
Test t1;
t1.a = malloc(SIZE);
t1.b = malloc(SIZE);
Test t2;
memcpy(t2,t1,sizeof(Test));
それが機能するかどうかは、何を意図するかによって異なります。t1
パディングを含めて からへのビットをコピーしますt2
が、もちろん、ポイント先の値ではなくポインタをコピーします。
パディングビットを気にしない場合 - そしてなぜそうすべきなのか - 簡単な代入
Test t2 = t1;
ポインタをコピーするだけです。
ポイント先の値を複製してコピーしたい場合は、コードも単純な割り当ても機能しません。
ポイント先のメモリ ブロックをコピーするには、まず、そのサイズを知る必要があります。ポインタからポイント先のメモリ ブロックのサイズを調べる (移植可能な) 方法はありません。
サイズが a#define
で指定されている場合、もちろんそれを再利用できます。それ以外の場合は、割り当てられたブロックのサイズをどこかに保存する必要があります。
しかし、新しく割り当てられたメモリ ブロックは、コピーされるブロックとは異なるアドレスを持っているため、ポインター値をコピーする必要はまったくありませt1
んt2
。
Test t2;
t2.a = malloc(SIZE); /* be aware that this is bytes, not number of ints */
t2.b = malloc(SIZE);
if (t2.a == NULL || t2.b == NULL) {
/* malloc failed, exit, or clean up if possible */
fprintf(stderr,"Allocation failure, exiting\n");
exit(EXIT_FAILURE);
}
/* malloc was successful in both cases, copy memory */
memcpy(t2.a, t1.a, SIZE);
memcpy(t2.b, t1.b, SIZE);