メモリ/構造体の内容をコピーする・memcpyは使わない!
の編集
Top
/
メモリ
/
構造体の内容をコピーする・memcpyは使わない!
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
#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)
タイムスタンプを変更しない
#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)
テキスト整形のルールを表示する
添付ファイル:
struct_cp.c
616件
[
詳細
]