C言語の質問です sizeof演算子について教えてください

sizeof(int)でint型のbyte数が分かるのはなぜでしょうか?(どういった処理をしている?)
sizeofは演算子と呼ばれていますが、関数と何が違うのでしょうか

また、sizeofで配列のサイズが求められますが
関数に配列(ポインタ)を渡して、その関数内でsizeofを使用すると
配列のサイズが分からなくなってしまうのはなぜでしょうか

たとえば

char a[10]を宣言した関数内でsizeof(a) は10(配列のサイズ)を返すが
aを他の関数に渡し、他の関数内でsizeofを呼び出すと4(ポインタのサイズ)を返す

いろいろ質問してしまいましたが
ご存知の方がいらっしゃいましたが
回答をお願いいたします

回答の条件
  • 1人50回まで
  • 登録:
  • 終了:2013/04/23 08:28:20
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tantawaan No.1

回答回数15ベストアンサー獲得回数3

ポイント200pt

sizeof演算子で型のサイズがわかるのはそれは処理系(コンパイラー)が知っているからとしか言えません。型のサイズがわからなければまともにメモリーの確保もできません。逆に言えばC言語はそれを使う人に、型のサイズを取得するインターフェイス、つまりsizeof演算子を提供しないときちんとしたプログラムが書けない場面がでてくる言語でもあります。

なお、ほとんどのコンパイラーはsizeof(int)のような場合は最適化の一部としてコンパイル時に数値化してしまうはずです。

aを宣言したスコープ内でのaの型はint[10]ですので、sizeof(a)の値はsizeof(int)*10になります。関数で渡した先では型は int* ですので、ポインタのサイズがsizeofの値となります。

C言語では配列の値渡しはできませんので、常にこうなります。呼び出された関数のスコープ内では元の配列のサイズ情報は失われています。

なお、構造体のメンバーとして配列を宣言してしまえば値渡しにすることができますが、一般的にはそのぶんメモリと速度が犠牲になります。

id:fujimasa1985

ありがとうございます

2013/04/23 08:27:45

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません