首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消引用空指针在操作大小中是有效的。

取消引用空指针在操作大小中是有效的。
EN

Stack Overflow用户
提问于 2013-11-05 09:25:41
回答 2查看 5.7K关注 0票数 26

我遇到了一段代码片段,对我来说,这些代码应该会因为分段错误而崩溃,但它的工作没有任何问题。该代码加上相关的数据结构如下(上面有相关的注释):

代码语言:javascript
复制
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时崩溃和烧毁吗?

EN

回答 2

Stack Overflow用户

发布于 2013-11-05 09:26:48

sizeof操作符是一个纯编译时操作.运行时什么都不做,这就是它工作正常的原因。

顺便说一句,path成员实际上不是一个指针,所以在技术上它不可能是NULL

票数 10
EN

Stack Overflow用户

发布于 2015-06-10 21:52:55

声明sizeof是一个纯粹的编译时构造(就像当前的答案一样)并不完全准确。由于C99,sizeof不是一个纯粹的编译时构造。sizeof的操作数是在运行时计算的,操作数类型是VLA.到目前为止公布的答案似乎忽略了这种可能性。

您的代码很好,因为它不涉及任何VLA。然而,这样的事情可能是另一回事。

代码语言:javascript
复制
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]中的空点取消引用是否会在这里产生未定义的行为。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19785518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档