2009-11-06 40 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的存储类型更改为静态,静态变量生命期是整个程序,因此您可以返回它的引用。