我遇到了一段代码,对我来说应该崩溃分段故障,但它仍然可以顺利工作。有问题的代码加上相关的数据结构如下(相关注释位于上面):
typedef struct {
double length;
unsigned char nPlaced;
unsigned char path[0];
}
RouteDefinition* Alloc_RouteDefinition()
{
// NB: The +nBags*sizeof.. trick "expands" the path[0] array in RouteDefinition
// to the path[nBags] array
RouteDefinition *def = NULL;
return (RouteDefinition*) malloc(sizeof(RouteDefinition) + nBags * sizeof(def->path[0]));
}
为什么这有效?我认为sizeof the char* 将解析为给定体系结构上指针的大小,但在取消引用 a 时它不应该崩溃并烧毁吗?NULL
-指针?
为什么这有效?
这有效是因为sizeof是一个编译时构造,除了变长数组根本不评价。如果我们看一下C99标准草案部分6.5.3.4
运算符的大小段落2 says(强调我的):
[...] 大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则对操作数求值;否则,不计算操作数结果是一个整数常量。
我们还在段落中看到以下示例5这证实了这一点:
double *dp = alloc(sizeof *dp);
^^^ ^
|
This is not the use of uninitialized pointer
在编译时type确定表达式的值以便计算结果。我们可以通过以下示例进一步证明这一点:
int x = 0 ;
printf("%zu\n", sizeof( x++ ));
这不会增加x
,这非常整洁。
Update
正如我在我的答案 to 为什么 sizeof(x++) 不增加 x?有一个例外sizeof
是一个编译时操作,即它的操作数是一个可变长度数组(VLA)。虽然我之前没有指出引用自6.5.3.4
上面确实说了这一点。
尽管在 C11 中而不是 C99 中,未指定是否sizeof
在这种情况下是否被评估。
另外,请注意这个问题有一个 C++ 版本:不评估应用了 sizeof 的表达式是否可以合法地在 C++ 中取消引用 sizeof 内的 null 或无效指针?.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)