#navi(../)
* 構造体の内容をコピーする・memcpyは使わない! [#s95169f0]
構造体のコピーを作るとき、memcpy関数を使用して複製をつくるようにコードを書いている人も多いと思います。~
gccはANSI準拠なので、代入式で構造体の複製を作れるのはしっているでしょうか?~
以下にC言語サンプルソースを記します。

#contents
#htmlinsertpcsp(c-top.html,c-sp.html)

*関連記事 [#e2c2bb6f]
-[[メモリの内容を指定した値で初期化する・memset>メモリ/メモリの内容を指定した値で初期化する・memset]]
-[[メモリ内容をコピーする・memcpy>メモリ/メモリ内容をコピーする・memcpy]]
-[[構造体の内容をコピーする・memcpyは使わない!>メモリ/構造体の内容をコピーする・memcpyは使わない!]]
-[[メモリの比較を行う・memcmp>メモリ/メモリの比較を行う・memcmp]]
-[[動的にメモリを取得する・malloc>メモリ/動的にメモリを取得する・malloc]]
-[[動的メモリサイズを拡張する・realloc>メモリ/動的メモリサイズを拡張する・realloc]]
-[[malloc,calloc,reallocで取得したメモリを解放する・free>メモリ/malloc,calloc,reallocで取得したメモリを解放する・free]]
-[[指定した文字数分コピーする・memmove>メモリ/指定した文字数分コピーする・memmove]]
-[[指定したバイトの指定個数分メモリを確保する・calloc>メモリ/指定したバイトの指定個数分メモリを確保する・calloc]]

* 代入式を使った構造体の複製 [#u24675c8]

&ref(struct_cp.c); (改行コードLF)
 #include <stdio.h>
 #include <string.h>
 
 struct INT_MEMBERS {
     int a;
     int b;
     int c;
 };
 
 int main(void)
 {
     struct INT_MEMBERS src, dest;
 
     src.a = 1;
     src.b = 2;
     src.c = 3;
 
     dest = src;    /* struct copy */
 
     printf("dest.a = %d\n", dest.a);
     printf("dest.b = %d\n", dest.b);
     printf("dest.b = %d\n", dest.c);
 
     return 0;
 }


上記のC言語サンプルコードのコンパイルと実行結果を記します。
 $ gcc struct_cp.c -o struct_cp
 $ ./struct_cp 
 dest.a = 1
 dest.b = 2
 dest.b = 3


memcpyを使って構造体のコピーを作らない理由は、バグを少なくするためです。~
誤ってmemcpyのsrc,destに構造の異なる構造体を指定しコピーした場合は、メモリ破壊をしてしまいます。~
しかし、代入式の場合であれば、コンパイル時にエラーとなるためコードのミスを簡単に見つけることができます。

以上、構造体のコピーはmemcpyを使わない!でした。

#htmlinsertpcsp(c-btm.html,c-sp.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS