gpt4 book ai didi

c++ - 是否对 C++ 中定义的空指针进行成员访问?

转载 作者:行者123 更新时间:2023-12-02 10:01:36 25 4
gpt4 key购买 nike

空指针的地址计算是否在 C++ 中定义行为?这是一个简单的示例程序。

struct A { int x; };
int main() {
A* p = nullptr;
&(p->x); // is this undefined behavior?
return 0;
}

谢谢。

编辑 下标包含在 this other question 中.

最佳答案

&(p->x);  // is this undefined behavior?

标准对此有点含糊:

[expr.ref] ... The expression E1->E2 is converted to the equivalent form (*(E1)).E2;

[expr.unary.op] The unary * operator ... the result is an lvalue referring to the object ... to which the expression points.


本节中没有明确提及 UB。引用的规则似乎与空指针不指向任何对象的事实相冲突。这可以解释为是的,行为未定义。

[expr.unary.op] The result of the unary & operator is a pointer to its operand. ... if the operand is an lvalue of type T, the resulting expression is a prvalue of type “pointer to T” whose result is a pointer to the designated object ([intro.memory]).


同样,不存在指定对象。请注意,操作数左值在任何时候都不会转换为右值,这肯定是 UB。
早在 2000 年就有 CWG issue澄清通过 null 的间接性是否未定义。提议的决议 (2004) 将澄清通过 null 的间接不是 UB,到目前为止似乎尚未添加到标准中。
但是,UB 是否是 UB 并不重要,因为您不需要这样做。至少,结果指针将是无效的,因此无用。
如果您打算将指针转换为整数以获取成员的偏移量,则无需这样做,因为您可以使用 offsetof 代替我们。来自标准库的宏,它没有 UB。

&(p[1]); // undefined?

在这里,行为很明显是未定义的:

[expr.sub] ... The expression E1[E2] is identical (by definition) to *((E1)+(E2)), except that in the case of an array operand, the result is an lvalue if that operand is an lvalue and an xvalue otherwise.

[expr.add] When an expression J that has integral type is added to or subtracted from an expression P of pointer type, the result has the type of P.

  • If P evaluates to a null pointer value and J evaluates to 0 (does not apply)

  • Otherwise, if P points to an array element (does not apply)

  • Otherwise, the behavior is undefined.



&(p[0]); // undefined?

根据之前的规则,第一个选项适用:

If P evaluates to a null pointer value and J evaluates to 0, the result is a null pointer value.


现在我们又回到了通过这个 null 间接访问是否是 UB 的问题。见答案开头。
不过,其实也无所谓。没有必要写这个,因为这只是写 sizeof(int) * i 的不必要的复杂方式。 ( i 分别为 1 和 0)。

关于c++ - 是否对 C++ 中定义的空指针进行成员访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62335968/

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