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

标签 c++ pointers stack pointer-arithmetic stack-corruption

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

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

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

由于代码是自动生成的,我无法解决这个问题。

我的解决方法是这样的:

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

Run-Time Check Failure #2 - Stack around the variable 'in_mat' was corrupted.

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

编辑:

这是完整的设置:

#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

关于c++ - 转置矩阵的内存黑客破坏堆栈,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33846360/

相关文章:

C++ 运算符因此重载 ('+' , '+=' )

C++堆栈实现,不在函数中保留内存

c++ - 在 Windows 中锁定文件

python - 与 Python 相比,C 中的切片

c - 当函数调用返回时,压入堆栈的参数会发生什么变化?

c++ - tao_idl -GSTL 不映射 std::string

c - 我的程序在 C 中反转字符串有什么问题?

objective-c - 从 C 程序员的角度来看,在 Objective C 中保留对象

javascript - 将具有本地状态的递归函数转换为使用堆栈

python - Python中中缀符号的前缀符号