如何在c++中将动态数组转换为静态数组
How to cast dynamic array to static array in c++?
在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);
相关文章:
- 如何在C++中将数组转换为矢量指针
- 将C++中的数组转换为字符串
- NLOHMANN 的 JSON 库将数组转换为结构向量
- 将 int 数组转换为 std::vector<int*>
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将字节数组转换为带有字节序问题的指针
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 将字符数组转换为时间结构
- 将字节数组转换为多维数组
- 可视化 如何在C++中将字符数组转换为 FILE 类型
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- C++如何将字符数组转换为字节向量(向量<byte>)
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 无法将字符数组转换为包含 utf-8 字符的字符串
- 如何使用 C++将 2D RGB 数组转换为 dds 文件?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 将 int 数组转换为带有小数C++的双精度数组
- 使用 .data() 将字符数组转换为 std::string 不会转换整个数组
- 将字符数组转换为整数值