转置矩阵的内存黑客破坏堆栈,C++
Memory hack to transpose matrix corrupts stack, C++
我需要用 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 时出现警告
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++ 实现矩阵转置过程。 问题是签名,函数必须这样调用:
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 时出现警告
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