2009-11-06 68 views
0
#include<iostream> 
using namespace std; 
struct sample 
{ 
    int data[3][2]; 
}; 
struct sample* function() 
{ 
    struct sample s; 
    int c=1; 
    for(int i=0;i<3;i++) 
     for(int j=0;j<2;j++) 
      s.data[i][j]=c++; 

    cout<<"Matrix contents are "; 
    for(int i=0;i<3;i++) 
    { 
     for(int j=0;j<2;j++) 
      cout<<s.data[i][j])<<"\t"; 
     cout<<"\n"; 
    } 
    return &s; 
} 
int main() 
{ 
struct sample *ss; 
ss=function(); 
cout<<"Matrix contents are "; 
for(int i=0;i<3;i++) 
{ 
    for(int j=0;j<2;j++) 
     cout<<ss->data[i][j]))<<"\t"; 
    cout<<"\n"; 
} 
return 0; 
} 

這裏有什麼錯誤?當我顯示內容該功能它獲得輸出,但當我試圖顯示內容之外的功能時,它顯示垃圾。哪裏不對?將結構指針返回到主函數,出現分段錯誤

回答

6

您的s變量被分配到堆棧上,然後您將返回一個指向它的指針;但是,功能結束時,s不再存在,並且指針不再有效。

您可以動態分配s並返回引用/指針,也可以返回s的副本而不是引用。

換句話說,您有一個dangling pointer的情況。

0

變量s是局部函數==>當函數返回時它將被破壞 局部變量具有自動存儲類型並且生命期限於它們被定義的範圍。

您可以將變量s的存儲類型更改爲靜態,靜態變量生命期是整個程序,因此您可以返回它的引用。