结构返回错误-C
这个程序是用C语言编写结构返回错误-C
它应该得到两d阵列(matrixAdd),并与scanMtx进行扫描(扫描功能是不是在这里监守的代码是不相关)
问题:EDMtx函数返回扫描矩阵1,1,1,,1,-8,1,,1,1,1 当它返回到主它是:0,0,0, 0,0,0,垃圾,垃圾,垃圾
似乎有一个地址错误
我做了什么错?
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
struct matrix
{
int* ptr;
int row;
int column;
};
matrix EDMtx();
void main(int argc, char* argv[])
{
int matrixAdd[5][5]={{1,1,1,3,4},{1,1,1,3,4},{1,1,1,3,4},{1,1,1,3,4},{1,1,1,3,4}};
matrix mtx;
matrix scanMtx;
mtx.ptr=&matrixAdd[0][0];
mtx.row=5;
mtx.column=5;
scanMtx= EDMtx();
// mtx= ScanM(mtx,1,1,scanMtx);- doesn't important to you.
getchar();
}
matrix EDMtx()
{
int matrx[3][3]={{1,1,1},{1,-8,1},{1,1,1}};
matrix Mtx;
Mtx.ptr=&matrx[0][0];
Mtx.row=3;
Mtx.column=3;
return Mtx;
}
变量matrixAdd
和matrx
,以及它们指向的内存,只有局部范围。如果你希望它们在函数返回后持久化,可以声明它们,或者重新设计你的代码逻辑。 (例如,通过使用malloc
来明确地分配存储器)
哇,你们是好的。解决 – 2011-03-16 10:51:48
@almog毫无疑问,mvds是好的,但是考虑到当地的地址总是一面红旗。 'matrixAdd'无法转义'main'(没有什么可以),所以使用它的地址没有问题。但'&矩阵'逃脱'EDMtx' ...这就是错误。 – 2011-03-16 11:43:47
@almog如果说人们善良是不够的 - 通过接受一个好的答案来将你的言语付诸行动。 – 2011-03-16 11:45:32
在EDMtx中,Mtx.ptr被指向堆栈变量。这可能会被破坏。如果你想交换指针变量,他们必须在堆上
matrix EDMtx()
{
int matrx[3][3]={{1,1,1},{1,-8,1},{1,1,1}};
matrix Mtx;
Mtx.ptr=&matrx[0][0];
Mtx.row=3;
Mtx.column=3;
return Mtx;
}
matrx
是一个局部变量。所以,在返回EDMtx()
时,它会超出范围。而Mtx.ptr
有本地变量matrx
的参考。因此scnMtx
的指针成员在取消引用时正在获取垃圾值。 永远不会返回局部变量的引用。
只是一个问题:你是否得到编译器警告? – mvds 2011-03-16 10:39:09
没有编译器警告或错误(使用微软视觉) – 2011-03-16 10:41:31