#include <stdio.h>のコンパイルオプションでアライメント変化とsizeofの変化を見たい

このQ&Aのポイント
  • gccを使用して、コンパイルオプションでアライメントを変化させながらsizeof(struct st)の変化を確認したいです。
  • また、gccでの警告オプションについても教えてください。
回答を見る
  • ベストアンサー

#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しかないのでしょうか?

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

GCCのマニュアル http://gcc.gnu.org/onlinedocs/index.html 日本語訳は古いバージョンのしか見つからなかった。 > アライメントを変化させながら http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes コンパイラオプションでやるなら、-Dでマクロを使うなりして。 インテルプロセッサだと http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options の > -mpreferred-stack-boundary=num > -mincoming-stack-boundary=num というあたりも関係あるかも >警告オプションは-Wと-Wallしかないのでしょうか http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Warning-Options.html#Warning-Options

その他の回答 (1)

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

とりあえず, お使いの gcc のオプションを頑張って全部調べることをお勧めします.

関連するQ&A

  • なぜgccはstdio.hをインクルードしなくてもprintfが実行できるのか

    なぜgccはstdio.hをインクルードしなくてもprintfが実行できるのでしょうか。 暗黙にインクルードされるヘッダと されないヘッダファイルの差分等あれば教えていただきたく。。 // main.c int main(){ printf("SWSW\n") ; return 0 ; } % gcc main.c % ./a.out SWSW

  •    #include<stdio.h>

       #include<stdio.h> #include<math.h> int main(void) { int i,n,limit; printf("data? "); scanf("%d",&n); i(n>=2){ limit=int)sqrt(n); for(i=limit;i1;i--){ if(n%i==0) break; } if(i==1) printf("素数\n); else printf("素数でない\n"); } return 0; } というプログラムがあるのですが、それを改良して int型(符号付32ビット整数)および、unsigned int型(符号なし32ビット整数)のそれぞれの最大の素数を求めよという問題があり、ただし、エラトステネスのふるいは使わずに、上のプログラムを改良してみよという問題がどっかにあったんですが、全然わからないので、教えてください。

  • #include<stdio.h>

    #include<stdio.h> main () { int a,b; printf("適当な数字\n"); scanf("%d %d",&a,&b); printf("(a*b)%(a+b)=%d\n",(a*b)/(a+b)); return (0); } で結果が 任意の数字 2 3 (a*b)(a+b)=1 ん なんですが違いますよね? 商の余りを求めるにはどう改変すればいいでしょうか?

  • #include <stdio.h>

    #include <stdio.h> int main(void) { int num1,num2; int num3 = 5; printf("所持金を入力してください?"); printf("%d",&num1); printf("\n"); printf("購入品の金額を入力してください?"); printf("%d",&num2); printf("\n"); printf("\n"); printf("購入金額%d円\n", num2); printf("\n"); printf("消費税額%d円\n", num2 * num3/100); printf("\n"); printf("合計金額%d円です \n", num2 * num3/100+num2); printf("\n"); printf("お釣りは%d円です \n", num1-(num2 * num3/100+num2)); printf("\n"); printf ("内訳は \n"); printf("\n"); printf("10000円紙幣:%d枚 \n",(num1-(num2 * num3/100+num2))/10000); printf("5000円紙幣:%d枚 \n",(num1-(num2 * num3/100+num2))/5000); printf("1000円紙幣:%d枚 \n",(num1-(num2 * num3/100+num2)-5000)/1000); printf("500円硬貨:%d枚 \n",(num1-(num2 * num3/100+num2)-7000)/500); printf("100円硬貨:%d枚 \n",(num1-(num2 * num3/100+num2)-7000)/100); printf("50円硬貨:%d枚 \n",(num1-(num2 * num3/100+num2)-7200)/50); printf("10円硬貨:%d枚 \n",(num1-(num2 * num3/100+num2)-7250)/10); printf("5円硬貨:%d枚 \n",(num1-(num2 * num3/100+num2)-7270)/5); printf("1円硬貨:%d枚 \n",(num1-(num2 * num3/100+num2)-7275)/1);   printf("です。\n"); return 0; }  なんかエラー出ます・・・どこが間違ってるんでしょうか?

  • 構造体メンバ及び、strncpy()について

    /* 構造体のメンバを char name[30]; にした時は実行できますが、char *name; としたときはプログラムを実行できません。 コンパイルエラーはともに出ないのですが、strncpy();の使い方が間違っているのか、先に構造体側でメモリサイズを確保しないと、使えないのか? メンバをポインタで持たせた構造体を初期化する関数の作り方を教えてください。 よろしくお願いします。 */ #include <stdio.h> #include <string.h> typedef struct{ char *name; int no; }ST; void set_name(ST *st, char *name, int no); int main(void) { ST st; set_name(&st, "テスト", 1); printf("%s No%d\n", st.name, st.no); return 0; } void set_name(ST *st, char *name, int no) { strncpy(st->name, name, 30); st->no=no; }

  • C言語について

    #include <stdio.h> struct syoukai{ int no; char name[5]; }; int main(void) { struct syoukai mine = {3, "aaaaa"}; int cmdID ; printf("コマンドを入力してください\n"); scanf("%d\n",cmdID); if(cmdID == 1) printf("%d\n",syoukai.no, syoukai.name); } これをコンパイルして実行すると Segmentation fault とエラーになってしまい原因がわかりません 教えていただけますか?

  • 動きが部分的におかしくなる要因

    以前はアドバイスありがとうございました。 配列オーバーフロー? http://okwave.jp/qa4406037.html 以前のプログラムで以下を暗号化→解読化すると元通りにはならず、 6,8,64,66,67,68行目だけがおかしくなります。 明らかにその行に無い文字が交じってきたりしますが、 初期化はしておりますし、他の行は大丈夫なのに 何故この行だけがおかしくなるのか(暗号化の時点で既におかしいです) わかりません。 同じ作り込みをしていて、一部分だけ動きがおかしくなるのは どういった理由があるのでしょうか? 特に周期性は見られません。 ↓下の行から1行目 #define MAX_MOJI 250 /* ファイルNAME */ #include <stdio.h> #include <stdlib.h> typedef struct { char ch; double d1; float fl; short sh; int in; long ln; } testcell; char c1; char ch2[2]; char ch3[3]; double d; testcell t; char c2; char c3; long ln; float fl; char *p; static int st; void main( void ); void func( int ); void main( void ){ char* alc = malloc( 1000 ); func( 100 ); printf( "\nメイン\n" ); printf( "allocated addr : %p\n", alc ); printf( "func() addr : %p\n", func ); printf( "main() addr : %p\n", main ); printf( "addr of printf : %p\n", printf ); printf( "char c1 %2d : %p\n", sizeof(c1), &c1 ); printf( "char ch2[2] %2d : %p\n", sizeof(ch2),ch2 ); printf( "char ch3[3] %2d : %p\n", sizeof(ch3),ch3 ); printf( "double d %2d : %p\n", sizeof(d), &d ); printf( "testcell t %2d : %p\n", sizeof(t), &t ); printf( "char c2 %2d : %p\n", sizeof(c2), &c2 ); printf( "char c3 %2d : %p\n", sizeof(c2), &c3 ); printf( "long ln %2d : %p\n", sizeof(ln), &ln ); printf( "float fl %2d : %p\n", sizeof(fl), &fl ); printf( "char *p %2d : %p\n", sizeof(p), &p ); printf( "static int st %2d : %p\n", sizeof(st), &st ); printf( "\nコウゾウタイ\n" ); printf( "char ch %2d : %p\n", sizeof(t.ch), &t.ch ); printf( "double d1 %2d : %p\n", sizeof(t.d1), &t.d1 ); printf( "float fl %2d : %p\n", sizeof(t.fl), &t.fl ); printf( "short sh %2d : %p\n", sizeof(t.sh), &t.sh ); printf( "int in %2d : %p\n", sizeof(t.in), &t.in ); printf( "long ln %2d : %p\n", sizeof(t.ln), &t.ln ); } void func( int p ){ static int s; int loc; printf( "\nファンクション\n" ); printf( "parameter addr : %p\n", &p ); printf( "func static addr : %p\n", &s ); printf( "func local addr : %p\n", &loc ); }

  • stdio.hをオープンできない…

    borlandのコンパイラーについての質問です(昔本付属のCDからインストールしたものです。verは5.5だと思われます。) ソースファイル include<stdio.h> void main(void){ printf("おめでとう!!\n"); } コンパイル c:\borland\bcc55\bin>bcc32 basic.c エラーメッセージはE2209 basic.c 1:インクルードファイルstdio.hをオープンできない、となります。このためprintfが使えないエラーメッセージも表示されます。過去の質問を色々と見させて頂きました。以前(昨年夏頃)には使えていた為、必要なファイルが消えている等の原因はなさそうです。メモ帳でbcc32も開いてみましたが-I"c:\borland\Bcc55\include"-L"c:\borland\Bcc55\libの表示があったので必要なファイルも開けているのではないかと勝手に解釈しています(bcc32.cfgフォルダなるものは存在しませんでしたが…)。いろいろと頑張ってみたのですがどうにもダメそうです。コンパイラが作動しないと課題が前に進まないため、大変困っています。是非皆様のお力をお貸し下さい。よろしくお願いします。

  • 名簿作成 表示について

    名簿作成のプログラム、コンパイルしたときに 自分で入れた名簿を全て表示させたいのですが main関数をどう変えれば出来るでしょうか? このままだと、1人分しか表示されません。 初心者なので丁寧に教えてくださればと思います。 #include<stdio.h> #define NAMELEN 30 #define NOLEN 10 char s; struct gakuseki{ char no[NOLEN]; char name[NAMELEN]; int age; }; struct gakuseki input_data(void){ struct gakuseki st; printf("input student number>"); scanf("%s",&st.no); /*getchar(); fgets(st.no,NOLEN,stdin);*/ printf("input name>"); getchar(); fgets(st.name,NAMELEN,stdin); printf("input age>"); scanf("%d",&st.age); printf("continue?(y/n)"); scanf("%s",&s); return st; }; void output_data(struct gakuseki g){ printf("----------------------------------\n"); printf("student number : %s\n",g.no); printf("name : %s\n",g.name); printf("age : %d\n",g.age); }; int main(){ int i,j; struct gakuseki stud; for(i=0;i<3;i++){ /* struct gakuseki stud;*/ stud=input_data(); if(s=='n') { break; }; }; output_data(stud); };

  • ポインタについてです。

    #include <stdio.h> int main (void){ char (*a)[3]; printf("a: %d\n", sizeof(a)); printf("a[0]: %d\n", sizeof(a[0])); printf("a[0][0]: %d\n", sizeof(a[0][0])); return 0; } このようなプログラムがあったとして a: 4 a[0]: 3 a[0][0]: 1 のような結果が得られました。a[]が3であるのは理解できたんですが、その他の結果があんまり理解できません・・・・ 解説をお願いします。

専門家に質問してみよう