我一直使用这种 malloc 风格
int *rc = 0;
rc = malloc(sizeof(*rc));
但是,即使当我调用时sizeof(*rc)
我假设它也不会出现段错误rc==0
,并且我正在取消引用一个NULL
指针。
我一直使用这种 malloc 风格
int *rc = 0;
rc = malloc(sizeof(*rc));
但是,即使当我调用时sizeof(*rc)
我假设它也不会出现段错误rc==0
,并且我正在取消引用一个NULL
指针。
你并没有真正取消引用任何东西。的参数sizeof
不被评估,除非它是一个 VLA。语言明确允许将您想要的任何“垃圾”作为sizeof
. 该语言保证它不会评估任何内容,只需对表达式类型执行编译时分析。例如,表达式sizeof i++
保证不会改变 的值i
。
该规则的唯一例外是可变长度数组。for VLAs的结果sizeof
是一个运行时值,这意味着该参数被评估并且必须是有效的。
运算符实际上并不评估其sizeof
操作数,它只查看其类型。的类型*rc
是int
,所以它等价于sizeof (int)
。这一切都发生在编译时。
(此外,这不是“malloc 内部”。)
您实际上并没有取消引用指针,而是在向编译器询问类型rc
指向的大小。在这种情况下sizeof
,在没有指针的情况下在编译时解决。
这相当于sizeof(type of *rc)
(换句话说,sizeof(int)
),而不是sizeof(data stored at the location pointed to by rc)
。 sizeof()
适用于类型,而不是值。
sizeof 从不考虑实际数据,只考虑类型,因此没有必要(也没有意义)尊重指针。