Home > C言語 > Javaとかスクリプト言語からC言語に戻ってくると警戒しすぎて不思議に思ってしまうこと

Javaとかスクリプト言語からC言語に戻ってくると警戒しすぎて不思議に思ってしまうこと


typedef struct COPY_STRUCT {
   int a;
   char b[4];
   int c;
} COPY_STRUCT;

int main(int argc, char* argv[]) {
   COPY_STRUCT hoge, fuga;
   hoge.a = 1;
   memcpy(hoge.b, "abc", 4*sizeof(char));
   hoge.c = 2;

   fuga = hoge;
   memcpy(hoge.b, "def", 4*sizeof(char));
   printf("%d, %s, %d\n", fuga.a, fuga.b, fuga.c);
   return 0;
}

ちゃんと


1, abc, 2

って表示されるんだぜ?
COPY_STRUCT.bがポインタだったらだめだろうけど、サイズの決まった配列なら一気にちゃんとコピーしてくれる。当たり前のことだが、Cって配列とかはめんどくさいイメージがあるから、JavaとかPHPとかそういう高級な言語から戻ってくると警戒しすぎて不思議に思ってしまう。

以上

Comments:3

匿名 09-04-13 (月) 1:02

配列のコピーができると言うよりは、
C言語では「構造体のディープコピー」ができるので(K&R時代はできなかった環境もある)
そのメンバも複製されてます。

ちなみに、言語仕様上でsizeof(char)は常に1と定義されているので、sizeof(char):1をかける意味はありません。
(C/C++では、sizeof(char):1を基準として他のデータのサイズを表現するため)

コスミー 09-04-13 (月) 21:55

>配列のコピーができると言うよりは、
>C言語では「構造体のディープコピー」ができるので(K&R時代はできなかった環境もある)
>そのメンバも複製されてます。
誤解を与えたかもしれませんが、この辺は一応理解しています(つもり)。
K&R時代~ってのは知りませんでしたが(笑)
スクリプトばっかやってると逆に変な気分になるって言う。

>ちなみに、言語仕様上でsizeof(char)は常に1と定義されているので、sizeof(char):1をかける意味はありません。
プログラム上は意味はないと思いますが、他の型の場合でも統一的に書くためと、「char型の配列を作ってるんだぜ」っていう意思表示のため、個人的には必要だと思っています。

匿名 09-04-15 (水) 0:17

失礼しました。m( _ _ )m

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://red-treasure.com/report/wp-trackback.php?p=345
Listed below are links to weblogs that reference
Javaとかスクリプト言語からC言語に戻ってくると警戒しすぎて不思議に思ってしまうこと from コスミー報告書[社外秘]

Home > C言語 > Javaとかスクリプト言語からC言語に戻ってくると警戒しすぎて不思議に思ってしまうこと

Search
Feeds
Meta
 合計:022976
 今日:0021 昨日:0110

Return to page top