【发布时间】:2020-11-10 20:42:34
【问题描述】:
在最近的一篇文章中,我意识到在分配结构变量时,与将结构类型传递给 sizeof() 相比,传递取消引用的指针被认为是一种更好的做法。这基本上是因为前者比后者更能适应代码更改。
这表明,在以下代码中,方法 1 被认为比 方法 2 更好。
typedef struct X_ {
int x;
int y;
int z;
} X;
int main() {
X* obj1 = malloc(sizeof(*obj1)); // ----> method 1
X* obj2 = malloc(sizeof(X)); // ----> method 2
return 0;
}
问题是,在 方法 1 中取消引用 obj1 的有效性如何?在malloc 内部,obj1 仍然是未构造/未初始化的内存,这表明在sizeof() 内部发生的obj1 的取消引用不应该是有效的。
让我猜一下是什么让 方法 1 有效。这是因为 sizeof() 是一个编译时操作,取消引用 obj1 被编译器翻译成方法 2?
有人可以通过参考相关的C标准来详细说明它的技术有效性吗?
【问题讨论】:
-
你没有取消引用任何东西...
sizeof不会评估其操作数(VLA 除外),即sizeof (42/0)不会尝试除以零 :) -
@pmg 我对“你没有取消引用任何东西”有点困惑......我知道
sizeof不会评估它的操作数,除非是 VLA......但是,如果sizeof(*obj1)不是取消引用obj1(这是指向X的指针)来获取X,那么我们怎么称呼它呢?是不是因为这是一个编译时操作,所以不被视为“解除引用”? -
@dwillis77:
sizeof只关心类型。*obj的 类型 与obj的值相同(即使obj具有无效/不确定/陷阱值)。int/int(42/0)的类型是int,即使值没有意义:-)
标签: c pointers malloc language-lawyer sizeof