通过指针读取多维数组或向量是否安全?

时间:2015-07-06 07:32:30

标签: c++ arrays multidimensional-array

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];

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

是否通过指针直接或间接读取数组元素会产生影响吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

int pixelIdx = column + row * rowSize;

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