首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存攻击转置矩阵破坏堆栈,C++

内存攻击转置矩阵破坏堆栈,C++
EN

Stack Overflow用户
提问于 2015-11-21 17:24:24
回答 1查看 157关注 0票数 4

我需要在C++中实现一个矩阵转置过程。问题是签名,函数必须像这样调用:

代码语言:javascript
复制
transpose(in_mat[0][0], n, m, out_mat[0][0])

其中n和m是维数。所有的值都是双倍的,包括矩阵和维数。

由于代码是自动生成的,所以我无法修复这个问题。

我的解决办法如下:

代码语言:javascript
复制
void transpose(double& in_mat, const double _n, const double _m, double& out_mat)
{
    int n = _n, m = _m;
    double* in_pointer= &in_mat;
    double* out_pointer= &out_mat;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            *(out_pointer+(j*n+i)) = *(in_pointer+(i*m + j));
        }
    }
}

效果很好。我用两个不同宽度和高度的矩阵构造了一个测试用例。一个充满了随机数,另一个充满了零。然后调用转置过程,并对两个矩阵进行比较。功能是正确的。

但它破坏了堆叠。在Visual 2015中运行时,有一个警告

运行时检查失败#2 -变量'in_mat‘周围的堆栈已损坏。

我做错什么了?为什么堆栈损坏了?调用transpose之后的代码工作正常。

编辑:

以下是完整的设置:

代码语言:javascript
复制
#include <random>
#include <iostream>

void transpose(double& in_mat, const double _n, const double _m, double& out_mat)
{
    int n = _n, m = _m;
    double* in_pointer = &in_mat;
    double* out_pointer = &out_mat;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            *(out_pointer+(j*n+i)) = *(in_pointer+(i*m + j));
        }
    }
}


int main()
{

    double in_mat[5][4];
    double out_mat[4][5];// assign matrix

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 5; j++) {
            in_mat[i][j] = std::rand();
            out_mat[j][i] = 0;
        }
    }

    double n = 5;
    double m = 4;

    transpose(in_mat[0][0], n, m, out_mat[0][0]);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (in_mat[i][j] - out_mat[j][i]>0.0001) {
                std::cout << "code is broken" << std::endl; //never reached
            }
        }
    }
    std::cout << "finished" << std::endl;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-21 18:05:29

在初始化矩阵时,下标(或循环限制)是向后的。

你有

代码语言:javascript
复制
double in_mat[5][4];
double out_mat[4][5];// assign matrix

for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 5; j++) {
        in_mat[i][j] = std::rand();
        out_mat[j][i] = 0;
    }
}

j==4out_mat结束后写作时

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33846360

复制
相关文章

相似问题

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