内存黑客转置矩阵破坏堆栈,C++

Memory hack to transpose matrix corrupts stack, C++

本文关键字:堆栈 C++ 黑客 转置 内存      更新时间:2023-10-16

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

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

其中n和m是尺寸。所有值都是双值,包括矩阵和维度。

由于代码是自动生成的,我无法修复此问题。

我的解决方法如下:

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 Studio 2015中运行时,会出现警告

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

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

编辑:

以下是完整的设置:

#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;
}

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

你有

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==4写入超过out_mat 的末尾时