c++ - sizeof(T) 增量中的字节智能指针算法 : Undefined Behaviour?

标签 c++ pointers language-lawyer

sizeof(int) 为增量对 char * 类型的指针(指向 int 数组)执行指针算术是否为未定义行为 然后取消引用? 例如。考虑下面的代码。它会调用未定义的行为吗?

我觉得/*1*/这行应该是合法的,/*2*/肯定是合法的,但是我不确定/* 3*/.

有一个prior question问了类似的问题,但没有公认的答案。

int foo() {
  int arr[10] = {0};
  int i = 4;
  int s = sizeof(int);
  /*1*/ const char * cmem = reinterpret_cast<const char*>(&arr[0]);
  /*2*/ cmem += i * s;
  /*3*/ return *reinterpret_cast<const int*>(cmem);
}

最佳答案

这段代码没问题。允许在对象的边界内(或结束后的边界)进行指针运算,并且严格的别名规则允许使用仅在 const-ness 上与实际对象不同的左值来访问该对象对象。

关于c++ - sizeof(T) 增量中的字节智能指针算法 : Undefined Behaviour?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43334359/

相关文章:

c++ - 在下面的示例中,函数对象 "rev"是根据自身定义的。这怎么可能?

c - 指针寻址行为

c++ - `(T *)0 - (T *)0` 是否明确定义为 0?

c++ - 结构化绑定(bind) : when something looks like a reference and behaves similarly to a reference, 但它不是引用

c++ - 自由函数和继承

c++ - 连续启动线程可能导致内存泄漏?

c - C 中的指针 : when to use the ampersand and the asterisk?

c++ - 模板特化的友元声明失败

c++ - 在C++中,我遇到无法理解的编译器错误

C++删除二叉树中的最小元素