【发布时间】:2014-08-15 07:50:42
【问题描述】:
我正在使用下面的代码来查找某些属性的对齐属性。我知道存储 NULL 指针是定义的行为,指针操作也是定义的行为,只有取消引用 NULL(和其他无效值)指针才会调用未定义的行为。我的问题很简单:-> 是否意味着取消引用指针(从而导致下面代码中的未定义行为)?
#include <iostream>
void f(void *p)
{
std::cout << p << std::endl;
}
struct X
{
int a;
int b;
};
struct Y
{
int a[2];
int b;
};
int main()
{
X *x = NULL;
Y *y = NULL;
f(&x->b);
f(&y->b);
}
【问题讨论】:
-
在我看来
&x(和&y)和->都会导致未定义的行为。一个是因为您要查询NULL的地址,另一个是因为您要取消引用NULL指针。 -
你实际上有两个问题。
&x和x->b一样都是 UB,所以这种表达方式会导致各种问题。 -
@wolfpack88:其实
&的优先级比->低,然后再评估:en.wikipedia.org/wiki/… -
@park-young-bae:这里没有运算符重载(我的代码已经有了这个保证)。
-
@wolfPack88 即使表达式是
(&x)->b,&x并没有采用NULL 的地址(无论如何这没有意义),你正在采用变量@987654336 的地址@。在这种情况下,代码不会编译,因为X*没有任何名为b的成员。 vinipsmaker:从 §5.2.5/2 - 表达式 E1->E2 转换为等效形式 (*(E1)).E2。所以你的代码有未定义的行为。