【问题标题】:Is it safe to read a multidimensional array or vector through a pointer?通过指针读取多维数组或向量是否安全?
【发布时间】:2015-07-06 07:32:29
【问题描述】:
void playWithThePixels(void* p, int depth, int pitch, int width, int height);

typedef unsigned char Pixel[4];
std::vector<Pixel[1600]> screen(900);
playWithThePixels(screen.data(), 32, 1600, 1600, 900);
return 0;

C 数组的元素和std::vector 都保证是连续的,因此screen 应该在内存中连续布局。

我知道越界访问数组元素是未定义的行为,但是在通过指针读取时如何,例如在示例代码中?

如果你这样做了会怎样

std::cout << screen[0][10000][0];

?这是定义的行为吗?我显然正在访问一个分配的区域。

通过指针直接或间接读取数组元素有区别吗?

【问题讨论】:

  • 程序格式错误:vector 类型参数不能是数组类型(例如,由于分配器要求)。
  • @KerrekSB 好的,然后让我将向量交换为 std::array 或普通数组或指向数组的指针。
  • 一般规则是: 1) 不要越界访问数组。 2) 没有类型双关语。基本上,你的想法是不允许的。
  • 我非常想把这个作为One-dimensional access to a multidimensional array: well-defined C? 的骗子来结束,但人们会在标签差异上有所提及;但是在这种情况下,语言要求相同的行为。

标签: c++ arrays multidimensional-array


【解决方案1】:

是的,它应该可以工作。唯一的原因是 Pixel[1600] 的大小将适合大多数 CPU 架构的对齐条件。

通常,在图像处理中,最简单的方法是将图像放在一维数组中,然后手动或通过封装访问的相应类进行计算以访问像素。

例如,在您的情况下,索引计算将是:

int pixelIdx = column + row * rowSize;

在您的情况下,rowSize 将是 1600。在大多数情况下,图像的宽度和高度在编译时是未知的,因此无论如何您都必须采用该策略。

【讨论】:

  • 这是错误的。只有一个vector,你似乎在反对vector&lt;vector&lt;…&gt;&gt;。在实践中,OP 示例可以工作(至少使用std::array),但它违反了标准的严格规则。
  • 你是绝对正确的。我要更新我的帖子。感谢您的提示。
猜你喜欢
  • 2014-07-26
  • 2020-08-21
  • 1970-01-01
  • 2010-09-25
  • 2015-07-02
  • 1970-01-01
  • 2021-10-23
  • 2013-05-12
相关资源
最近更新 更多