2011-03-16 155 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的指針成員在取消引用時正在獲取垃圾值。 永遠不會返回局部變量的引用。