c++ - `->` 是否意味着取消引用?

标签 c++ pointers alignment

我正在使用下面的代码来查找某些属性的对齐属性。我知道存储 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 *x = (struct *)malloc(sizeof(struct));
f(&x->b);

它对x 执行间接寻址以定位它指向的结构,然后选择该结构的b 成员。它类似于调用

 f( &(*x).b ); // which is same as f( & ( (*x).b ) );

因为在你的例子中 x 是一个 NULL 指针,取消引用一个 NULL 指针会调用未定义的行为:
C++11:8.3.2 引用资料(第 4 页):

Note: in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior.

关于c++ - `->` 是否意味着取消引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24396987/

相关文章:

c++ - 派生类继承了getter,找不到返回正确值的方法

c++ - 在宏中拆分字符串

c# - 如何在 C# 中存储函数指针

c++ - 正确增加指针?

c - 编写一个返回最近日期的函数

html - 使用显示 :table 在 div 下均匀分布的居中 CSS 第二行 lis

c++ - 如何正确访问打包结构成员

c++如何按类类型对 vector 进行排序

c++ - (c++, Armadillo ) 替换矩阵中的一部分列 vector

javascript - 如何在同一行中对齐图例标记中的三个元素?