我遇到了一段代码片段,对我来说,这些代码应该会因为分段错误而崩溃,但它的工作没有任何问题。该代码加上相关的数据结构如下(上面有相关的注释):
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]));
}为什么要这么做?据我所知,char*的大小将解析为给定体系结构上指针的大小,但它不应该在取消引用NULL-pointer时崩溃和烧毁吗?
发布于 2013-11-05 09:26:48
sizeof操作符是一个纯编译时操作.运行时什么都不做,这就是它工作正常的原因。
顺便说一句,path成员实际上不是一个指针,所以在技术上它不可能是NULL。
发布于 2015-06-10 21:52:55
声明sizeof是一个纯粹的编译时构造(就像当前的答案一样)并不完全准确。由于C99,sizeof不是一个纯粹的编译时构造。sizeof的操作数是在运行时计算的,操作数类型是VLA.到目前为止公布的答案似乎忽略了这种可能性。
您的代码很好,因为它不涉及任何VLA。然而,这样的事情可能是另一回事。
unsigned n = 10;
int (*a)[n] = NULL; // `a` is a pointer to a VLA
unsigned i = 0;
sizeof a[i++]; // applying `sizeof` to a VLA根据C99标准,sizeof的参数应该被求值(即i应该是递增的,参见https://ideone.com/9Fv6xC)。但是,我并不完全确定a[0]中的空点取消引用是否会在这里产生未定义的行为。
https://stackoverflow.com/questions/19785518
复制相似问题