响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:c:tips:sizeof

Sizeof的几点事项

标准C定义了一个无符号类型size_t,作为sizeof操作符的返回值类型。

当sizeof的操作数是表达式时,通常不进行类型转换,所以当操作数是数组时,sizeof能获得数组的大小,而不是数组转换为的指针的大小。但如果表达式中包含其他操作符,需要进行类型转换后才能决定表达式size时,则将进行类型转换。

例如:

        short s = 4;
        printf("%ld\n", sizeof(s + 0));

这里sizeof(s + 0)=sizeof(int),因为s+0导致short提升为int。

此外,当sizeof的操作数是表达式时,对表达式的分析是在编译阶段进行的,也就是说该表达式并不进行计算。如:

        int i = 1;
        printf("%ld\n", sizeof(i++));

这里i的值依旧为1,而不是2。

但对于变长数组(variable length array),如果数组大小表达式影响sizeof的计算结果,则该表达式必须先计算;如果不影响,则该表达式可算可不算。如:

        int n = 10;
        int a[n++];

这里n的值为11。

而:

static int f(int *n)
{
        return ++(*n);
}
 
int main(void)
{
        int n = 10;
        printf("%ld\n", sizeof(int (*)[f(&n)]));
}

这里n的值可为10,也可为11,因为f()不影响sizeof的结果。

computer/c/tips/sizeof.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1