首页 > 解决方案 > 为什么在传递给 malloc 时取消引用 Wild 或 null 指针不会导致分段错误?

问题描述

这些代码会导致分段错误:

int *i;
printf("%d\n", *i);
int *i = NULL;
printf("%d\n", *i);

而这些没有:

int *i;
i = malloc(sizeof *i);
int *i = NULL;
i = malloc(sizeof *i);

在所有示例中,野指针和空指针被取消引用并作为参数传递给应该导致分段错误的函数。为什么使用 malloc 的示例没有按预期运行并产生分段错误?

标签: cpointerssegmentation-faultmallocdereference

解决方案


在涉及 的最后两种情况下,实际上并未计算运算符sizeof的操作数。sizeof观察它的类型,并在编译时计算结果。

C 标准中关于操作符的第 6.5.3.4p2 节sizeof规定:

运算符产生其sizeof操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

所以没有发生实际的指针取消引用。

此外,不能保证取消引用 NULL 指针或未初始化的指针会导致崩溃。它实际上是未定义的行为,所以它可能会崩溃,也可能不会。


推荐阅读