11

我一直使用这种 malloc 风格

int *rc = 0;
rc = malloc(sizeof(*rc));

但是,即使当我调用时sizeof(*rc)我假设它也不会出现段错误rc==0,并且我正在取消引用一个NULL指针。

4

4 回答 4

26

你并没有真正取消引用任何东西。的参数sizeof不被评估,除非它是一个 VLA。语言明确允许将您想要的任何“垃圾”作为sizeof. 该语言保证它不会评估任何内容,只需对表达式类型执行编译时分析。例如,表达式sizeof i++保证不会改变 的值i

该规则的唯一例外是可变长度数组。for VLAs的结果sizeof是一个运行时值,这意味着该参数被评估并且必须是有效的。

于 2012-11-26T22:42:34.950 回答
8

运算符实际上并不评估其sizeof操作数,它只查看其类型。的类型*rcint,所以它等价于sizeof (int)。这一切都发生在编译时。

(此外,这不是“malloc 内部”。)

于 2012-11-26T22:43:22.377 回答
4

您实际上并没有取消引用指针,而是在向编译器询问类型rc指向的大小。在这种情况下sizeof,在没有指针的情况下在编译时解决。

于 2012-11-26T22:42:48.953 回答
3

这相当于sizeof(type of *rc)(换句话说,sizeof(int)),而不是sizeof(data stored at the location pointed to by rc)sizeof()适用于类型,而不是值。

sizeof 从不考虑实际数据,只考虑类型,因此没有必要(也没有意义)尊重指针。

于 2012-11-26T22:42:58.337 回答