【问题标题】:Byte-Wise Pointer Arithmetic in sizeof(T) increments: Undefined Behaviour?sizeof(T) 增量的字节指针算术:未定义的行为?
【发布时间】:2017-04-10 23:21:03
【问题描述】:

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);
}

【问题讨论】:

  • 没关系。你也可以只做(arr+i) 如果你有一个 T 类型的指针 p1 和一个指向相同地址的 char 指针 p2,那么 'p1 + i' 等于 '*(p2 + i * sizeof(T))'。

标签: c++ pointers language-lawyer


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多