• ベストアンサー

sizeofの処理

お世話になります sizeof()の処理について教えてください typedef struct {   BYTE m_bDat;   WORD m_wWord; }tTEMP; sizeof( tTEMP ); この場合、アライメントは最小としたとして、サイズは3と帰ってくるとします。 アライメントをコンパイルオプション等を使用して、2として再度sizeofを行います この際、値は4となると思います 知りたいのは、sizeofの処理方法です よろしくお願い致します

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「処理方法」というのがよくわからんのだけど, sizeof はコンパイラが処理しちゃってますね. 例えば, アラインメントが 2 のときには, コンパイラが「BYTE の次の WORD を詰めるとアライン境界にそろわないから 1バイト間に入れよう」と思って 4バイトにするだけ.

その他の回答 (3)

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.4

↓詳しい説明 データ型のアラインメントとは何か,なぜ必要なのか? http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html ⇒ sizeof とアラインメントの関係   (sizeof がアラインメントの倍数に切り上げって知ってます?)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

質問への回答は既に出ていますが、少しだけ補足します。 sizeof演算子は、基本的にはコンパイル時に解決されるものですが、オペランドによっては実行時に解決されることもあります。 例えば、 void func(int n) {  int array[n];  printf("sizeof(array) = %zu\n", sizeof(array)); } のようなケースです。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

sizeofは、コンパイラが計算した構造体のサイズのデータを数値としてプログラム中に埋め込んでしまう機能です。 実行時に構造体のサイズを計算していませんので、sizeofの処理方法は?と聞かれればコンパイラの処理の一部としか言えません。

関連するQ&A

  • sizeof(long), sizeof(short)   (処理系依存と言うけれど・・・)

      数値(整数)型の定義サイズについて、質問です。 ANSIの規格では、 sizeof(short) ≦ sizeof(int) ≦ sizeof(long) としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。 しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、 sizeof(short) → 2 sizeof(int) → 2 sizeof(long) → 4 となっているようです。(手元にないので、gccでは確認していませんが・・・) 実際のところ、上記のサイズにならない処理系は実在するのでしょうか? 何故こんな質問をするのかというと、あるテキスト(事情があって、書名等の情報は出せないのですが)に > 次の sizeof 演算子の返す値として正しいものはどれですか。 > > long hoge[32]; > sizeof(hoge); > ------------------------------------------------------ > A. 32 > B. 64 > C. 128 > D. 256 > E. 512 という問題が掲載されており、解説が、 > 正解は C 。 > > long 型は 4 バイトで構成されるので、32 個の要素がある配列では、 128 バイトになります。 となっていたのです。(short型のサイズを問う類題あり) 特定の処理系が前提条件とされていないので、適切な設問、解説とは思えないのですが、誤りと断言できるほどの自信がないため、作者に指摘すべきか否か、迷っています。 sizeof(short) → 2、sizeof(long) → 4 にならない処理系が実在しなければ、規格の定義上は正しくなくても、実務上は誤りとは言えないような気もしますが、どうでしょうか? コメントをお待ちしております。  

  • #include <stdio.h>

    #include <stdio.h> struct st { char a[3]; short b; char c[7]; long d; char e[5]; }; int main(void) { printf("%d\n",sizeof(struct st)); return 0; } コンパイルオプションでアライメントを変化させながら(1,2,4,…) sizeof(struct st)の変化を見たいのですが、コンパイルする時に どのようにすれば良いのでしょうか?当方、gccを使用しております。 あと、ついでなんですが、警告オプションは-Wと-Wallしかないのでしょうか?

  • C言語の構造体のサイズについて

    いつもお世話になっていります。 早速ですが、C言語の構造体のサイズについて教えてください。 typedef struct B { short code; char name; float price; } B; typedef struct A { B bbb[10]; double sougaku; } A; A aaa; といった構造体があった場合に、 sizeof(aaa.bbb.code) + sizeof(aaa.bbb.name) + … + sizeof(aaa.sougaku) という風に一つ一つサイズを取得し、合計して構造体のサイズを取得した場合と sizeof(aaa) という風に構造体のサイズを取得した場合のサイズの値が異なるといった現象が起きます。 その原因が分からなくて困っております。 そこで考えられる要因をお教えください。 因みに実際の構造体はサイズで言えば2500バイトくらいあります。 froat/char/double/short 型を使用しております。 よろしくお願いします。

  • メモリ動的確保について

    こんにちはです。 メモリの動的確保なのですが、 typedef struct DATA{ char name[256]; char pass[256]; int money; }BANK; void insert(BANK *p,int max); int main(){ int i; size_t st; BANK *person; person = (struct DATA *)malloc(sizeof(struct DATA)); //person = (struct DATA *)malloc(5); if(person == NULL){ printf("確保失敗\n"); exit(-1); } //memset(person,'\0',sizeof(struct DATA)); と、言う風に、記載ソースは途中ですがメモリをとりました。 mallocの後ろの部分ですが、sizeof(struct DATA)と5ではどうちがうのでしょう??2通りともコンパイルエラーはないです。 5は動的に最大5までとるって事はわかるのですが、struct DATAの方はいくつとるのです??いくつもで入力次第です? そして、動的したのにたいしてmemsetしたら実行エラー(コンパイルは通りました)おきました。動的にたいしてmemはダメなのでしょうか? アドバイスいただけたらありがたいです。宜しくお願いいたします。

  • (Mac) sizeof演算子のコンパイル

    現在MacBookAirにて入門書を参考にC言語を学んでいます。 その中で、 #include <stdio.h> int main(void) { int a = 1; printf("short int型のサイズは%dバイトです。\n", sizeof(short int)); printf("変数aのサイズは%dバイトです。\n", sizeof(a)); return 0; } と入力しコンパイルすると sample21.c:7: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ sample21.c:8: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ と表示されコンパイルすることができません。 なんども見直してコードに間違いはないと思いますが、原因が解りません。 他のコードは問題なくコンパイルできます。 この先、sizeof演算子を使って値を求めなければならない章があり、非常に困っています。 どなたか解決策を教えてください。お願いします。

  • C言語、エラーメッセージが紐解けません。

    いつも大変お世話になり誠にありがとうございます。 標記の件。 エラーメッセージが紐解けません。 どうかどなたかアドバイスください。 下記にコードとコンパイルエラーを書きます。        記 コード #include <stdio.h> typedef struct Car{ int num; double gas; }Car; int main(void) { printf("int型のサイズは%dバイトです。\n", sizeof(int)); printf("double型のサイズは%dバイトです。\n", sizeof(double)); printf("構造体struct Car型のサイズは%dバイトです。\n",sizeof(Car)); printf("構造体struct Car型へのポインタのサイズは%dバイトです。\n",sizeof(Car *)); return 0; } コンパイラーエラー C:\MinGW>gcc text20.c -o text20 text20.c: In function 'main': text20.c:12:11: warning: unknown escape sequence: '\221' printf("構造体struct Car型のサイズは%dバイトです。\n",sizeof(Car)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ text20.c:13:11: warning: unknown escape sequence: '\221' printf("構造体struct Car型へのポインタのサイズは%dバイトです。\n",sizeof(Car *)); 以上です。 ご多忙中恐れ入ります。 ご回答の程宜しくお願い申し上げます。

  • 構造体のメンバーの静的なサイズ取得

    構造体のメンバーをヘッダーファイル中で得たい場合、 以下のような方法以外になにか方法はないでしょうか? 単純に XXXX x;と宣言してそれを sizeof(x.chwk)と 使うというような方法以外で なにかあれば教えてください。 ---------------------------------------- typedef struct { char chwk[100]; } XXXX; typedef struct { char chwk[ sizeof(( (XXXX*)0)->chwk ) ]; } YYYY; main(int arc, char *arg[] ){ YYYY y; printf( " YYYY chwk size = %d\n", sizeof(y.chwk)); }

  • C言語の構造体をpythonでやりたい

    現在ラズベリーパイでpythonでTCPクライアントを作っています。 現在サーバーに次のようなパケットを送信したいと思っているのですが、このC言語の構造体を同じバイト数で出力するようにpython言語にすることは可能でしょうか? どうぞ、ご教示いただきますよう、宜しくお願い致します。 typedef struct _PAYLOAD_ALIVE_ { BYTE MacAddr[6]; WORD Port; BYTE Relay; BYTE Set; BYTE AliveTime; BYTE SensorLen; BYTE Mail[40]; WORD Model[20]; BYTE testArea[4]; BYTE SWVer[4]; BYTE testSensor[16]; }PL_ALIVE;

  • Cソースのコンパイルのワーニングについて

    C初心者です。 お願いします。 Cソースをコンパイルしたのですが、ワーニングがでて、どうすればいいのか手も足もでません… 詳しい方ご教授ねがいます。 ワーニング内容 warning #4232-D:conversion from "DATA_T *" to a more strictly aligned type "DATA_BYTE *" may cause misaligned access sizeof(DATA_T),(DATA_BYTE *)data_t 型の定義に関してだと思うのですが、どうしていいかわかりません… キャストがうまくいってないような… 変数の定義は以下です。 typedef unsigned char DATA_BYTE_U typedef DATA_BYTE_U * DATA_BYTE typedef sutruct{ char head char dat char tail }DATA_T DATA_T *data_t OSはUNIXです。 情報が足りなければ教えてください。 よろしくお願いします。

  • メモリ領域の確保の仕方

    あまりうまく書けなかったのですがよろしくお願いします。 ファイルから二次配列を読み込むプログラムを作ろうとしました。 /*****行列Aに値を入れる********/ for(i = 0; i < Qap->iN; i++){ for(j = 0; j < Qap->iN; j++){ fscanf(fp, "%d", &Qap->matrixA[i][j]); } } /*****行列Bに値を入れる********/ for(i = 0; i < Qap->iN; i++){ for(j = 0; j < Qap->iN; j++){ fscanf(fp, "%d", &Qap->matrixB[i][j]); } } のように書くために、二次配列の領域を確保しようとしたとき、 #define SIZE 100 //行列のサイズ typedef struct hairetu{ int iN; int matrixA[SIZE][SIZE]; int matrixB[SIZE][SIZE]; }hairetu; としてmatrixA[SIZE][SIZE]のようにした場合は Qap = malloc(sizeof(hairetu));//hairetu分の大きさの領域を確保 とすれば領域を確保できたのですが、 typedef struct hairetu{ int iN; int **matrixA; int **matrixB; }hairetu; のように二次配列を**matrixAと表そうとして、 fscanf(fp, "%d", &Qap->iN); のようにファイルから行列のサイズを読み込もうとした場合、 Qap = malloc(sizeof(hairetu));//hairetu分の大きさの領域を確保 とやってもコンパイルはできるのですがアプリケーションエラーが出てしまいます。 何故だかよくわかりません。 二次配列を**matrixAのように表そうとした場合の領域確保の仕方を教えて下さい。 わかりづらくて本当に申し訳ありませんがお願いします。

専門家に質問してみよう