首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c++中将动态数组转换为静态数组?

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

Stack Overflow用户
提问于 2011-04-07 14:43:16
回答 3查看 2.9K关注 0票数 0

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

我有过

代码语言:javascript
复制
int ** da;
da = new int*[9];
for (int i=0; i<9; i++) da[i] = new int[9];

并且我的函数参数是int[9][9]类型的,我如何转换da,以便我的函数可以使用它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-07 14:53:56

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

您不能使用其中一个来代替另一个--没有任何强制转换会改变这两个在内存中完全不同的布局。

票数 10
EN

Stack Overflow用户

发布于 2011-04-07 15:31:25

你不需要-如果函数保持它的签名,你必须根据需要移动。示例:

代码语言:javascript
复制
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]相同。

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

票数 1
EN

Stack Overflow用户

发布于 2011-04-07 16:21:24

它可能与这个问题无关。但这让我想起了一个使用C的矩阵技巧。好的方面是我们只需要调用malloc和free一次。最糟糕的是……

代码语言:javascript
复制
// 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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5577026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档