首页 > 解决方案 > 正在使用强制转换 UB 展平多维数组

问题描述

下面的代码是否定义良好并保证按预期工作?

#include <iostream>
#include <string>

using std::string;

int main() {
  string const a[2][2][2] = {
      "1", "2", "3", "4", "5", "6", "7", "8",
  };

  auto constexpr sz = sizeof(a) / sizeof(string);
  auto const p = reinterpret_cast<string const*>(&a);
  for (std::size_t i = 0; i < sz; ++i) std::cout << p[i] << '\n';
}

据我所知,由于我们将其转换为指针,只要我们访问有效内存,就不会应用越界规则,因此,这是可以的。但我不能确定。

注意:我不是在问数组是否是连续的(它是),我是在问是否将多维数组转换为平面指针,并使用它来访问所有元素是明确定义的(不是 UB)。

标签: c++arrayspointerscastinglanguage-lawyer

解决方案


推荐阅读