如何在c++中将动态数组转换为静态数组

How to cast dynamic array to static array in c++?

本文关键字:数组 转换 静态 动态 c++      更新时间:2023-10-16

在c++中如何将动态数组转换为静态数组?

我有

int ** da;
da = new int*[9];
for (int i=0; i<9; i++) da[i] = new int[9];

和我的函数参数是类型int[9][9],我如何转换数据使我的函数可以使用它?

一个int[9][9]是内存中连续的81个整数,占用81*sizeof(int)字节。int *[9]是由9个指向整型的指针组成的序列,占用9*sizeof(int *)字节。每一个都被设置为指向9个不同的9个int的序列。

你不能用一个来代替另一个——没有强制转换会改变这两个在内存中的布局完全不同。

如果函数保留其签名,则必须在必要时移动。例子:

void function(int a[9][9]);
int tmp[9][9];
// move to temp
for (size_t i(0); i < 9; ++i) {
    for (size_t j(0); j < 9; ++j) {
        tmp[i][j] = da[i][j];
    }
}
function(tmp);
// move to da
for (size_t i(0); i < 9; ++i) {
    for (size_t j(0); j < 9; ++j) {
        da[i][j] = tmp[i][j];
    }
}

原因:2D数组的布局和对齐是显式定义的,并且实现是定义的。函数的实现需要精确的布局和对齐。其他布局显然会引入bug。

即使int tmp[9*9]也不能保证与int tmp[9][9]相同。

幸运的是,在堆栈上创建它并从/到复制是很便宜的。

这可能与这个问题无关。但这让我想起了一个使用c的矩阵技巧,好的部分是我们只需要调用malloc和free一次。不好的部分是.....

// create the buffer and assign the pointer array
int  i, j;
int* buffer = (int*) malloc(sizeof(int) * 81);
int* matrix[9]; // 9 * 9
for (i = 0; i < 9; ++i)
    matrix[i] = buffer + i * 9;
// assign some value using matrix[i][j]
for (i = 0; i < 9; ++i)
    for (j = 0; j < 9; ++j)
        matrix[i][j] = (i + 1) * (j + 1);
// retrieve the value in matrix
for (i = 0; i < 9; ++i)
    for (j = 0; j < 9; ++j)
        std::cout << matrix[i][j] << " ";
std::cout << std::endl;
// free the buffer
free(buffer);