7

程序的输出是什么

#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;
}
4

4 回答 4

18

除可变长度数组外,sizeof不计算其操作数。所以它只会产生fun(a)类型的大小, sizeof(int)(不调用函数)。

C11 (n1570) §6.5.3.4sizeof_Alignof运算符

2 [...] 如果操作数的类型是可变长度数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

于 2012-09-30T07:29:18.927 回答
4

它从该函数返回返回类型的大小(4在我的实现中,因为这是我所int占用的),如果您按原样运行它,您会发现它,然后将返回类型更改为char(此时它会给您1)。

C99标准的相关部分是6.5.3.4.The sizeof operator

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

请记住,粗体字表示函数本身没有被调用(因此printf它的内部没有被执行)。换句话说,输出只是你的int类型的大小(当然,后跟换行符)。

于 2012-09-30T07:28:53.080 回答
3

该函数返回int,所以它是sizeof(int),在 32 位系统上通常是 4 个字节。虽然它可能是 2 或 8,具体取决于实现。

于 2012-09-30T07:30:04.670 回答
1

关键字 sizeof 后跟省略号返回参数包中的元素数。

结果的类型是头文件中定义的无符号整数类型size_t

于 2012-09-30T07:29:14.717 回答