#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)