当我取消引用malloc中的NULL指针时,为什么我的程序不会出错?

我一直使用这种malloc风格

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

但是,即使我调用sizeof(*rc)我假设rc==0 ,并且我取消引用NULL指针,它也不会出错。

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

该规则的唯一例外是可变长度数组。 VLA的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从不考虑实际数据,只考虑类型,因此不需要(也没有意义)对指针进行处理。