当我取消引用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从不考虑实际数据,只考虑类型,因此不需要(也没有意义)对指针进行处理。