指向NULL的指针的sizeof()

时间:2014-08-28 09:23:45

标签: c pointers sizeof

以下是我的代码:

#include <stdio.h>

struct abc
{
    char a;
    int b;
};

int main()
{
    struct abc *abcp = NULL;
    printf("%d", sizeof(*abcp));    //Prints 8

    /* printf("%d",*abcp);            //Causes program to hang or terminate   */

    return 0;
}

据我所知,由于结构填充,struct的大小为8。但是,为什么sizeof()是&#39; * abcp&#39;在abcp&#39;时给出一个值。被指定为NULL? &#39; ABCP&#39;分配NULL意味着它没有指向任何地方吗?但是,为什么我得到上述代码的输出?

5 个答案:

答案 0 :(得分:6)

sizeof是一个运算符,而不是函数。

如果你放弃了毫无意义的括号,你会想起这个,然后写下来:

printf("%zu", sizeof *abcp);

这也使用C99正确的方式格式化size_t类型的值,即%zu

它起作用,因为编译器在编译时计算大小,而不是跟随(解除引用)指针当然(因为指针尚不存在;程序没有运行)。

答案 1 :(得分:4)

sizeof不是一个函数,它不会评估它的参数。相反,它在编译时推导出*abcp的类型,并报告其大小。由于abcpstruct abc**abcp的类型为struct abc,无论abcp点在哪里。

答案 2 :(得分:2)

来自C99标准

6.5.3.4/2

The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.

答案 3 :(得分:0)

给定Type *var,以下表达式是等效的:

sizeof(Type)
sizeof(*var)
sizeof(var[N]) // for any constant integer expression N
sizeof(var[n]) // for any variable integer expression n

这些表达式中的每一个在编译期间都被解析为常量值

因此,运行时var的值对这些表达式中的任何一个都没有影响。

答案 4 :(得分:0)

sizeof只返回* abcp的大小,此指针的大小为8。存储在指针中的地址是否有效无关紧要(NULL通常是无效地址)。