2011-03-16 150 views
1

这个程序是用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; 
} 
+0

只是一个问题:你是否得到编译器警告? – mvds 2011-03-16 10:39:09

+0

没有编译器警告或错误(使用微软视觉) – 2011-03-16 10:41:31

回答

0

变量matrixAddmatrx,以及它们指向的内存,只有局部范围。如果你希望它们在函数返回后持久化,可以声明它们,或者重新设计你的代码逻辑。 (例如,通过使用malloc来明确地分配存储器)

+0

哇,你们是好的。解决 – 2011-03-16 10:51:48

+0

@almog毫无疑问,mvds是好的,但是考虑到当地的地址总是一面红旗。 'matrixAdd'无法转义'main'(没有什么可以),所以使用它的地址没有问题。但'&矩阵'逃脱'EDMtx' ...这就是错误。 – 2011-03-16 11:43:47

+0

@almog如果说人们善良是不够的 - 通过接受一个好的答案来将你的言语付诸行动。 – 2011-03-16 11:45:32

0

在EDMtx中,Mtx.ptr被指向堆栈变量。这可能会被破坏。如果你想交换指针变量,他们必须在堆上

0
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的指针成员在取消引用时正在获取垃圾值。 永远不会返回局部变量的引用。