
C言語の構造体の勉強をしています。
構造体のデータを丸ごとコピーしたいのですが、今までは下記プログラムの★1の方法で1つ1つやっていました。
しかし変数が増えてきたのでできれば一度にコピーをしたいのですが、★2の方法では場合によってはゴミが含まれてしまいます。
そこで★3の方法で試すと今のところコピーできたのですが、これは安全なのでしょうか?
ご存知の方がおられればお願いします。
また、もっといい方法があればご伝授いただけると助かります。
#include <stdio.h>
#include <string.h>
struct Sample{
int val1;
int val2;
};
void test(Sample *p, int num){
Sample d;
switch(num){
case 1: //★1
d.val1 = p->val1;
d.val2 = p->val2;
break;
case 2: //★2
memcpy(&d, p, sizeof(Sample));
break;
case 3: //★3
d = *p;
break;
}
printf("val1:%d, val2:%d\n", d.val1, d.val2);
}
int main(){
Sample s;
s.val1 = 1;
s.val2 = 2;
test(&s, 1);
return 0;
}
No.6ベストアンサー
- 回答日時:
Cであれば、★2でも★3でも問題ありません。
★2の方法では、パディング部分の不定値もそのままコピーしますが、そもそもパディング部分にアクセスしたり、ましてやその値に依存したコードを書くこと自体間違っていますので、何の問題もありません。
ところで...
> Sample s;
という宣言を見る限り、(structが省略されているので)C++ではないかと思います。
C++の場合、memcpyで構造体をコピーできるのはC互換型(POD型)に限られます。その他のクラス(構造体を含む)をmemcpyでコピーすることはできません。
そのため、常に★3の方法を採用する方が無難です。
なお、構造体のメンバにポインタや参照を含む場合には、その参照先までコピー(すなわちディープコピー)を行うには、適切な代入演算子を定義する必要があります。
C++ではなくCの場合、専用のコピー関数を作るなどして対応する必要があります。
No.4
- 回答日時:
sizeof は「実際にメモリ上で構造体が占めるバイト数」を返します>#2.
つまり, アラインメントの都合上パディングが入る場合には, そのパディングも含めたバイト数になります. じゃないと配列を動的に確保できない.
No.2
- 回答日時:
★3でとくに問題はないです。
>★2の方法では場合によってはゴミが含まれてしまいます。
どの部分にゴミが入るかが記載されていませんが、構造体をmem系のAPIで扱うことはあまりよろしくありません。sizeof()を使用する場合も注意が必要です。
細かい理由は省きますが、「構造体で定義されているメンバの合計Byte数」=「実際にメモリ上に展開されている構造体のByte数」にはならないためです。
詳しいことは「構造体」「アライメント」「パディング」で調べてみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「#undef」と「#define」の使い...
-
Integer変数をカラにしたいので...
-
VBAのプログラムで、DIAG = 1# ...
-
構造体の初期化方法について
-
C言語 構造体の中に共用体を定...
-
charとucharの違い
-
構造体のポインタにNULLが入らない
-
構造体にする理由・利点・使用例
-
VBAの変数のデータ型を変更する...
-
VBAにてcolorindexを変数に格納...
-
C++ 構造体の一括初期化 {0}
-
C言語で確保できるビットの桁数
-
値が代入されてない時
-
ローカル変数の多重定義
-
整数から16進数への変換 現在c...
-
aspでユーザー定義の構造体を作...
-
VB6変数の宣言dim j,k,p,m,n as...
-
構造体のデータを丸ごとコピー...
-
値が変わるのはどうしてでしょ...
-
long型のデータをバイト型の配...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
構造体のデータを丸ごとコピー...
-
VBAの変数のデータ型を変更する...
-
VBAにてcolorindexを変数に格納...
-
C言語 構造体の中に共用体を定...
-
値が代入されてない時
-
日付チェック関数について
-
long型のデータをバイト型の配...
-
typedefをプログラム中で解除す...
-
VBAで符号無し整数
-
変数の初期化について
-
C++ 構造体の一括初期化 {0}
-
命名規則 VB 構造体
-
構造体のポインタにNULLが入らない
-
異なる構造体のデータのコピー
-
FileTimeToSystemTime がコンパ...
-
構造体を型の異なる構造体に代入
-
1バイトデータの読み出しについて
おすすめ情報