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とかそういう高級な言語から戻ってくると警戒しすぎて不思議に思ってしまう。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C言語 パーマリンク

Javaとかスクリプト言語からC言語に戻ってくると警戒しすぎて不思議に思ってしまうこと への3件のフィードバック

  1. 匿名 のコメント:

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

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

  2. コスミー のコメント:

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

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

  3. 匿名 のコメント:

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

コメントを残す

メールアドレスが公開されることはありません。