• 締切済み

sizeofとポインタ

char *p; printf("%d",sizeof(*p)); これでなぜ1が出力されるのか分かりません。お願いします。

みんなの回答

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

すんません, 「int の」とあると, 「int 以外は決まっている」という解釈も可能なもので>#7. ちなみに sizeof は「バイト数」を返すとなっているんだけど C の規格では char は必ず 1バイトだから 1 と表示す... あれ? 規格上 printf("%d", sizeof(char)) で何が表示されるかは決まってない....

noname#137556
noname#137556
回答No.8

あ,1バイトが 16 ビットということもありうるのか orz

noname#137556
noname#137556
回答No.7

> #6 そだね。 # int 以外については何も言及していないつもりだったのだが。 それはそうと, int は最低でも2バイトだったと思ったけど,それも直接には決まってないのね。 INT_MAX の最小値(32767)が決まってたりするから,結局そうなるってことかな。

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

「int の」というか, 「(signed/unsigned を含む) char 以外」は全て処理系定義だったような気がする>#5. 言語仕様としては sizeof(int) は 1以上の任意の整数値 (もちろん size_t 型) でありうる. とはいえ, 9 とか 13 とかの変態な値を使うことはほとんどないだろうが....

noname#137556
noname#137556
回答No.5

> またchar *pの部分がint *pだったら4ですか? int のサイズは処理系に依存するので, 4 だったり,2 だったり,それ以外かもしれない。

noname#137556
noname#137556
回答No.4

char *p; この宣言は, *p が char 型と読むと良いです。 複雑な宣言になっても対応できる。

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

pが「char型へのポインタ」だから *p はその実体である「char型」 sizeof(*p) == sizeof(char) == 1 sizeof(char)==1と、Cの規格では決っている。 ポインタのサイズを知りたいなら 式での指定なら sizeof(p) 型での指定なら sizeof(char *) charに限らず XXX * pt ; だったら、 pt は「XXX型へのポインタ」(あるいは、 「(XXX *)型」の変数、と考える) *pt はその実体で「XXX型」 sizeof(*pt) == sizeof(XXX) sizeof(pt) == sizeof(XXX *)

回答No.2

pはポインタですが、*pはcharだから1で問題ありません。

ricefield-
質問者

お礼

有難うございました。

回答No.1

pはchar *型なので、*pはchar型 よってsizeof(*p) == 1

ricefield-
質問者

お礼

有難うございました。

ricefield-
質問者

補足

p*=charと一緒だということで良いのでしょうか? またchar *pの部分がint *pだったら4ですか?

関連するQ&A

  • ポインタの場合のsizeof()

    C言語の基礎かもしれませんが、質問させてください。 例えば char a[20] = "computer program"; printf("%d",sizeof(a)); とすると、char型なのでおそらく16と出力されると思うのですが、 char *a = "computer program"; と定義したとき、 printf("%d",sizeof(a)); とすると、どんな値が表示されるのでしょうか?

  • ポインタのsizeofについて

    C初心者です。 ポインタ宣言させた変数をsizeof()で値を取得させて 表示させてみました。 char *cp; short int *sp; int *ip; i = sizeof(cp); printf("%d\n",i); i = sizeof(sp); printf("%d\n",i); i = sizeof(ip); printf("%d\n",i); 結果は全て4となりました。 これはなぜですか? (ただの変数として宣言すれば1、2、4となります。この理由も理解できています。)

  • sizeof

    main() { char array1[256] = "abcdefg"; char *array2 = "stuvwxyz"; printf("array1 = %d\n",sizeof(array1)); // array1 = 256 printf("array1 = %d\n",sizeof(array1)/sizeof(char)); // array1 = 256 printf("array2 = %d\n",sizeof(array2)); // array2 = 4 printf("array2 = %d\n",sizeof(array2)/sizeof(char *)); // array1 = 1 printf("array2 = %d\n",sizeof(*array2)); // array2 = 1 } となるのですが、sizeof(array1)では、配列のサイズが取得できるのですが、array2がさす配列のサイズを得るためにはどうすればいいのですが?もしくは取得デキナイのはなぜでしょうか。 それと、 sizeof(array2)では、charへのポインタをさすから4バイト。 sizeof(*array2)では、sizeof(array[0])を意味するから1バイト という解釈でいいでしょうか。

  • sizeof が分かりません!

    Cの予約語で"sizeof"がありますが、 普段おきまりで良く使っているのですが、 いまいち理解出来ないので誰か教えて下さい。 例えば、以下の場合sizeofの結果はどうなりますか? char s_aaa[]="ABCDE"; char s_bbb[4]; memset(s_bbb, '\0', sizeof(s_bbb)); memcpy(s_bbb, s_aaa, sizeof(s_bbb)); printf("s_aaa → :[%d],[%d]\n", strlen(s_aaa), sizeof(s_aaa)); printf("s_aaa → :[%d],[%d]\n", strlen(s_bbb), sizeof(s_bbb));

  • ポインタを定義したらなぜsizeofで容量が表示できる?

    char *sz と定義しても実体はメモリに確保されていないはずなのに なぜ printf("%d",sizeof(*sz))でちゃんと1が表示されるんでしょうか? また、 sz = malloc( 100 )で printf("%d",sz)で100ではなく4となってしまうのはなぜですか? よろしくお願いします。

  • Sizeofが分かりません

    sizeofのデータサイズがどういう風に計算されているのかよく分かりません。 例えば以下のコードですが、 union Name { char firstName[10]; char lastName[10]; }; int main() { union Name name; strcpy(name.firstName, "Dennis"); strcpy(name.lastName, "Ritchie"); printf("%d", sizeof(name)); } outputは11となります。これはなぜでしょうか? 宜しくお願い致します。

  • sizeof()の使い方

    あるプログラムでちょっと珍しいソースコードがありました。 *************************************************************** int x[7]; int nx = sizeof(x) / sizeof(x[0]); for (i = 1; i < nx; i++) { -省略- } *************************************************************** sizeof()という珍しい関数を使っています。 このプログラムの目的は、sizeof()を使って、forの繰り返し回数を算出して、 プログラマー側がアルゴリズムを考えて、forの繰り返し回数を設定する手間を省いてくれることにあります。 しかし、ちょっとおかしな事がありまして、 printf("sizeof(x)="); printf("%d\n",&sizeof(x)); printf("sizeof(x[0])="); printf("%d\n",&sizeof(x[0])); printf("nx=sizeof(x) / sizeof(x[0]):"); printf("%d\n",&nx); を使って、sizeof(x),sizeof(x[0]),nxに何が設定されたかを確かめたところ、 sizeof(x)=28 sizeof(x[0])=7 nx=1638196 と分かりました。nxは”7”でないとおかしいと思うのですが、いかがでしょうか?

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

    #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であるのは理解できたんですが、その他の結果があんまり理解できません・・・・ 解説をお願いします。

  • 正しいsizeofの使い方とcharのポインタについて教えてくださいm(__)m

    C言語なのですが、 例えば、次のように実験してみました。 char * rec_fld[12]; int x,y; char tt[11]; ※rec_fld[1]には”私は完全な素人” という文字が入っていると思ってください。 x = sizeof( rec_fld[1] ); strcpy( tt, rec_fld[1] ); y = sizeof( tt ); すると、xは4とかいう数字が格納されていて、 yには11という数字が格納されていました。 ttが11なのは分かりやすいのですが、 なんで、xは、文字数の14とかにならないのでしょうか? sizeofの中の書き方が違うのでしょうか? あと、char *で配列宣言するのと、charで宣言するのとは 何が違うのでしょうか? どなたか、教えて下さいませ。

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

    以前はアドバイスありがとうございました。 配列オーバーフロー? 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 ); }

専門家に質問してみよう