以下是我的代码:
#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意味着它没有指向任何地方吗?但是,为什么我得到上述代码的输出?
答案 0 :(得分:6)
sizeof
是一个运算符,而不是函数。
如果你放弃了毫无意义的括号,你会想起这个,然后写下来:
printf("%zu", sizeof *abcp);
这也使用C99正确的方式格式化size_t
类型的值,即%zu
。
它起作用,因为编译器在编译时计算大小,而不是跟随(解除引用)指针当然(因为指针尚不存在;程序没有运行)。
答案 1 :(得分:4)
sizeof
不是一个函数,它不会评估它的参数。相反,它在编译时推导出*abcp
的类型,并报告其大小。由于abcp
是struct 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
通常是无效地址)。