gpt4 book ai didi

c - 取消引用未初始化的指针以传递给 sizeof()

转载 作者:行者123 更新时间:2023-12-03 20:25:10 29 4
gpt4 key购买 nike

在最近的一篇文章中,我意识到在分配结构变量时,与将结构类型传递给 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;
}
问题是,取消引用 obj1 的有效性如何?在方法 1 中?内 malloc , obj1仍然是未构造/未初始化的内存,这表明取消引用 obj1发生在里面 sizeof()不应该是有效的。
让我猜猜是什么使方法 1 有效。这是因为自 sizeof()是一个编译时操作取消引用 obj1被编译器翻译成方法 2?
有人可以引用相关的C标准详细说明这个的技术有效性吗?

最佳答案

操作数不是可变长度数组的 sizeof 表达式是未计算的表达式。所以这个表情

sizeof(*obj1)
格式良好。
来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)

2 The sizeof operator yields the size (in bytes) of its operand, whichmay be an expression or the parenthesized name of a type. The size isdetermined from the type of the operand. The result is an integer.If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and theresult is an integer constant


至于您关于指定 malloc 参数的最佳方法的问题
X* obj1 = malloc(sizeof(*obj1)); // ----> method 1
X* obj2 = malloc(sizeof(X)); // ----> method 2
那么如果类型 X在这种情况下使用 malloc 时可见
X* obj1 = malloc(sizeof(*obj1)); // ----> method 1
那么这种方法是可取的。
但是,如果类型不可见,例如
obj1 = malloc(sizeof(*obj1)); // ----> method 1
然后我更喜欢明确指定类型
obj1 = malloc(sizeof( X ));
否则,例如此代码片段
p = malloc( *p );
q = malloc( *q );
没有为代码的读者提供足够的信息。读者需要向前和向后滚动源代码才能找到 p 的声明。和 q以确定它们的类型。

关于c - 取消引用未初始化的指针以传递给 sizeof(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63015009/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com