sizeof的一种用法

《一》
sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式
进行计算。如:
sizeof( 2 );// 2的类型为int,所以等价于 sizeof( int );
sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价
于 sizeof( double );
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
,我们来看一个完整的例子:
char foo()
{
printf("foo() has been called.\n");
return 'a';
}
int main()
{
size_t sz = sizeof( foo() ); // foo() 的返回值类型为char,所以sz = sizeof(
char ),foo()并不会被调用
printf("sizeof( foo() ) = %d\n", sz);
}
C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算s
izeof值,即下面这些写法都是错误的:
sizeof( foo );// error
void foo2() { }
sizeof( foo2() );// error
struct S
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
sizeof( S.f1 );// error


《二》
3. sizeof的常量性
sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用,如:
char ary[ sizeof( int ) * 10 ]; // ok
最新的C99标准规定sizeof也可以在运行时刻进行计算,如下面的程序在Dev-C++中可以
正确执行:
int n;
n = 10; // n动态赋值
char ary[n]; // C99也支持数组的动态定义
printf("%d\n", sizeof(ary)); // ok. 输出10
但在没有完全实现C99标准的编译器中就行不通了,上面的代码在VC6中就通不过编译。
所以我们最好还是认为sizeof是在编译期执行的,这样不会带来错误,让程序的可移植性强些。




转载于:https://www.cnblogs.com/wensheng/archive/2009/12/10/1621485.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值