使用二维数组作为一维数组是否正确?可能会导致未定义的行为吗?

5 c++ arrays

这段代码合适吗?由于某种原因,使用2维数组作为1维弃用了吗?

char tab1[3][3];

for(int i = 0; i < 3; i++)
    for(int j = 0; j < 3; j++)
       tab1[i][j] = (char)i;

printf("%c", ((char*)tab1)[3]); // == tab1[1][0]
Run Code Online (Sandbox Code Playgroud)

Gal*_*lik -1

如果没有其他原因,这很好,因为char可以根据标准为所有其他类型别名。也是多维的数组被分配为连续块,因此它首先是内存中的一维数组。

我们知道,tab1衰减为指向连续多维数组(这是一个数组)的第一个元素的指针,并将该数组指针转换为char*(可以为任何别名)一定没问题。

如果有疑问,您可以随时这样做&tab1[0][0]。再次因为我们知道分配的内存是连续的。

编辑

如果这是一个整数数组 ( int tab1[3][3]) 那么情况就有点不同了。据我了解,标准之前指出,指向正确对象类型的指针是有效的, 无论它如何获取其值。这意味着强制转换应该没问题,因为我们知道由C++17int*tab1与第一个元素的地址相同。

然而,在该保证被删除之后,因此这种强制转换可能是 未定义的行为C++17

看到这个问题有关更多详细信息,

出于这个原因,我总是建议使用&tab1[0][0]它总是有效的。