プログラムの出力はどうなりますか
#include <stdio.h>
int fun(char *a){
printf("%d\n",sizeof(a));
return 1;
}
int main(){
char a[20];
printf("%d\n",sizeof (fun(a)));
return 0;
}
可変長配列を除いて、sizeofそのオペランドを評価しません。つまり、 (関数を呼び出さずに)fun(a)型のサイズを生成するだけです。 sizeof(int)
C11(n1570)§6.5.3.4
sizeofおよび_Alignof演算子2 [...]オペランドの型が可変長配列型の場合、オペランドが評価されます。それ以外の場合、オペランドは評価されず、結果は整数定数になります。
それはその関数からの戻り型のサイズを返します(それは私にとってはそれが私にとって負担4になるので私の実装ではint)、それをそのまま実行した場合にあなたはそれを発見し、次に戻り型をchar(その時点であなたに与えるでしょう)に変更しました1)。
C99標準の関連部分は次の6.5.3.4.The sizeof operatorとおりです。
sizeof演算子は、オペランドのサイズ(バイト単位)を生成します。これは、式または型の括弧で囲まれた名前の場合があります。サイズは、オペランドのタイプから決定されます。結果は整数です。オペランドの型が可変長配列型の場合、オペランドが評価されます。それ以外の場合、オペランドは評価されず、結果は整数定数になります。
太字のビットは、関数自体が呼び出されないことを意味することに注意してください(したがって、関数printf内は実行されません)。言い換えると、出力は単にintタイプのサイズです(もちろん、改行が続きます)。
関数はを返すintのでsizeof(int)、32ビットシステムでは通常4バイトです。実装に応じて2または8になる可能性がありますが。
キーワードsizeofの後に省略記号が続くと、パラメーターパック内の要素の数が返されます。
結果の型は、ヘッダーファイルで定義されている符号なし積分型size_tです。