スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

sizeofの罠 の続編 &RiSKさんへの返信

RiSK様、ご指摘ありがとうございます。
sizeofと配列の知識に間違いがあったことが理解できました。

しかし指摘いただいた点の誤解ではなかったようなので追記しておきます。
引数に配列を渡す時、配列が(暗黙に)型変換され,配列の先頭要素へのポインタが渡されるということは知っておりました。

というかすべてのプログラムを
void f(int a[])
ではなく
void f(int *a)
で書いていたりしました。

私が勘違いしていた点は
sizeofに配列の頭のポインタを渡せば大きさが帰ってくるものだと思っていた点(アホ)
です
ええ、あれなんです。

void show(char * test)
{
printf("%d\n",sizeof(test));
}

int main(
{
char test[100];

printf("%d\n",sizeof(test));
printf("%d\n",sizeof(&test[0]));
show(test);
}
結果:
100
4
4




関数どうのこうのよりも
printf("%d\n",sizeof(test));

printf("%d\n",sizeof(&test[0]));
の結果が違うことがわかっていなかったのです。



コメントありがとうございました!
理解が深まり感謝しております。






ねよっと。

コメントの投稿

非公開コメント

Re: sizeofの罠 の続編 &RiSKさんへの返信

こんにちは。エントリをあげてくださりありがとうございます。

>sizeofに配列の頭のポインタを渡せば大きさが帰ってくるものだと思っていた
ああ,なるほど。
なんか私,見当違いのこと言ってしまいました。
すみませぬ。

// 以下,独り言っぽいもの
sizeof はほとんどの場合定数を返します。
一方,ポインタは何を指しているのか分からないことがほとんどです。

void f(int* p){
printf("%d", sizeof(p));
}
int main(){
int a;
int b[1];
int c[2];
f(&a);
f(b);
f(c);
}

このとき関数 f の p には単なるオブジェクトのポインタやいろんなサイズの配列の先頭要素へのポインタが渡されます。

コンパイラにしてみれば sizeof は定数を返さなきゃならないので,ポインタが指すもともとの変わりうるサイズには答えられないよーってなります。
その点ポインタ自体のサイズはいつでも固定ですよね。コンパイラは sizeof ですぐ定数を決めることができます。

Re: Re: sizeofの罠 の続編 &RiSKさんへの返信

RiSKさんのようなコメントを頂けると「ブログを書いていてよかったなぁ」と心から思います。

益々の発展、健闘お祈りしております。
ありがとうございました。
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。