パスワードを忘れた? アカウント作成
10148927 journal
プログラミング

dodongaの日記: VC++2008 でのsizeof 17

日記 by dodonga

 dodongaです。

 以下が、腑に落ちない。

typedef unsigned char XXXX;
sizeof (XXXX);

   sizeof が4を返してくる。 1 を期待してたのだが・・・。

 サイズ計算で
        YYYY/(sizeof(XXXX)*8)

   としたら(YYYYはビット数)、 sizeof(XXXX) が 4 を返してくるので、領域不足で プログラムが木っ端微塵。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by miyuri (33181) on 2013年11月06日 19時36分 (#2490846) 日記

    XXXXの部分を間違って入力しているか、typedefを複数回使っていそう。

    • by dodonga (4178) on 2013年11月06日 20時51分 (#2490887) 日記

       dodongaです。

      # 守秘義務あるけど、これくらいいいよね(^^:

      #pragma pack(push , 1)

      const int JADGE_RECORD_MAX_NUM = 1024;
      >snip

      struct JADGE_FILE_HEADER {
              typedef unsigned char USER_DATA_IND;
              USER_DATA_IND user_data_ind[JADGE_RECORD_MAX_NUM/(sizeof(USER_DATA_IND)*8)];
              unsigned int info_num;
              JADGE_FILE_HEADER(){
                      memset(this , 0 , sizeof(JADGE_FILE_HEADER) );
              }
      };
      #pragma pack(pop)

      --
      閑話休題
      親コメント
      • by miyuri (33181) on 2013年11月06日 22時41分 (#2490958) 日記

        とりあえず、Visual C++ 2008 Express Edition、ソリューションやら何やらのプロパティに手を付けずにデバッガで見たところ、user_data_indはunsigned char [128]だったよ。

        memset(this, 0, sizeof *this);なんて書かないから、その方面については知らない:b

        #ふと、JADGEをぐぐってみた

        親コメント
      • by Anonymous Coward

        構造体の中でtypedefしているのでメンバーと見なされパディングされた結果でしょう
        typedefと構造体の外に出せば解決すると思いますよ

      • by Anonymous Coward

        コンストラクタで memset とかヤバくないっすか。

        http://www.kijineko.co.jp/tech/superstitions/zero-clear-in-constructor.html [kijineko.co.jp]

        • by Anonymous Coward

          そうだね、プログラムが木っ端微塵になったのはこのせいじゃないの?
          そうでなければ、コンパイラのバグだろう。gcc は 1 になるぞ(gcc も #pragma pack はサポートしている)。

        • by Anonymous Coward

          リンク先のはゼロクリアすべきではないものまでゼロクリアしていることが問題。今回のはゼロクリアしてもいいものだから、それ自体は問題とは言えない。ただ、固定長配列のゼロクリアなら初期化子リストで済むよね。基本的には初期化子リストでメンバ変数を初期化。

          疑問の解決にはなっていないけど。

  • by WindKnight (1253) on 2013年11月06日 18時57分 (#2490814) 日記
    コンパイルオプションで、アライメント(Alignment)を詰められるはずです。
    その場合、実行速度が落ちるかもしれませんが。

    変数の先頭アドレスを 4byte 毎に配置したほうが実行速度が稼げるのです。
    • by Anonymous Coward

      構造体でもないのにpaddingって入りましたっけ?

      • typedef で何が起こっているかが、問題だよねぇ。たぶん。

        wchar_t に化けてないとすれば、padding くらいしか思いつきません。

        コンパイラの bug という線は考えにくいし。

        とりあえず、コンパイルオプションを漁ってみるべきですね。
        親コメント
  • by Anonymous Coward on 2013年11月06日 18時18分 (#2490783)

    なにか勘違いしているようだが、x86、x86_64においては、Windowsだろうが、Linuxだろうが、BSDだろうが、MacOSだろうが、コンパイラの種類、バージョンを問わずcharは1だよ。
    君はVisualStudioの設定でcharとwchar_tを同一視させてるに過ぎない。
    とりあえずコンパイラの使い方の学習を初める時期だと思うよ。

    # こういう素人が涌くから総合開発環境ってのは善し悪しなんだよな。
    # 素人には黙ってNMAKE使わせときゃいいんだよ。
    # 自分がどんな定数やマクロ、オプションを設定しているのか?どんなライブラリとどのようにリンクしているのか?
    # それを理解しないまま一人前の口を聞く輩が多すぎる。

    • by Anonymous Coward

      /Jオプションを付けてもcharはunsigned charになるだけでsizeof(char)は1のままです。
      何か隠し設定でもあるのですか?

    • by Anonymous Coward

      玄人ヅラするならwchar_tが2バイトでなく4バイトになるからくりをぜひ解説してほしいな。

      • by Anonymous Coward

        まあwchar_tが4バイトになる変態環境はWindowsくらいなものだがたぶんWindowsだろうし

        • by Anonymous Coward

          Androidが4バイトなんだが。
          そもそもwchar_tは2バイトなんてのは偶然で、仕様的には2バイトに限らない。

        • by Anonymous Coward

          逆だろ。wchar_tがデフォルト2バイトなのはWindowsぐらい。
          他は大抵4バイト UTF-16なんて使えない文字コードを標準に据えてるから。

      • おい、素人にさらにデタラメ吹き込んで混乱のズンドコに突き落とす競争してるんだから邪魔するな。
        # とでも思わないとコメント欄がひどすぎて見てられない

typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...