为啥出了方法.局部变量还存在?我没用new

gnhao 2009-11-02 10:23:45
typedef struct LinkInfo
{
int a;
int b;
char *str;
}LINKINFO,*PLINKINFO;


void GetT(LINKINFO **info)
{
LINKINFO links[5];
LINKINFO a;
a.b=103;
links[4]=a;
*info=links;
}
调用
LINKINFO *info;
GetT(&info);
//info=links;
cout <<info[4].b<< endl;

为啥还能正确定输出103?我新手.按我所想links该没了才对.这是咋回事?下边这样也行

LINKINFO * GetT()
{
LINKINFO links[5];
LINKINFO a;
a.b=103;
links[4]=a;
return links;
}

LINKINFO *info;
info=GetT();
//info=links;
cout <<info[4].b<< endl;

不明白我.
...全文
119 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ct025028 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jameshooo 的回复:]
这只是碰巧罢了,因为虽然栈指针恢复了,但由于没有申请其它栈内存,所以栈数据暂时还存在。

你可以用不同方式试验一下,例如为结构添加析构函数(内存值复位),或者在GetT调用之后马上构造其它的局部变量,像下面这样:
LINKINFO* info;
GetT(&info);
char killStack[128] = "abc"; // 加一个干扰变量
cout < < info[4].b < < endl;
[/Quote]

这种方法不行,局部变量在函数调用时分配,而不管在什么地方声明。
wfx_net 2009-11-02
  • 打赏
  • 举报
回复

即使数据是正确的,也决对不能用。
fandh 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jameshooo 的回复:]
这只是碰巧罢了,因为虽然栈指针恢复了,但由于没有申请其它栈内存,所以栈数据暂时还存在。

你可以用不同方式试验一下,例如为结构添加析构函数(内存值复位),或者在GetT调用之后马上构造其它的局部变量,像下面这样:
LINKINFO* info;
GetT(&info);
char killStack[128] = "abc"; // 加一个干扰变量
cout < < info[4].b < < endl;
[/Quote]
接个电话,被抢先了!
qiangorqiang 2009-11-02
  • 打赏
  • 举报
回复
反回的是指向内存的指针,他指向一个失效的变量。但有可能这个失效的变量的内存数据还没有在其他地方表分配和修改。
ct025028 2009-11-02
  • 打赏
  • 举报
回复
函数的局部变量在栈上分配,你调用GetT(&info)后,进入GetT函数,系统会在栈顶为你分配LINKINFO
links[5]的存储空间,函数GetT返回后,系统调整栈顶指针,但这仅仅是调整,并没有将原来的东西覆盖掉,所以存储空间的值并没有变,调试程序时,查看堆栈就很容易发现这个问题。

另外你可以做如下实验:
在调用GetT后,调用如下函数。

void OverWrite()
{
char str[1024];
memset(str, 0, 1024);
}

另外,二楼的方法是不行的,因为局部变量是在一函数调用时即分配,而不管它是在什么地方声明的
jameshooo 2009-11-02
  • 打赏
  • 举报
回复
这只是碰巧罢了,因为虽然栈指针恢复了,但由于没有申请其它栈内存,所以栈数据暂时还存在。

你可以用不同方式试验一下,例如为结构添加析构函数(内存值复位),或者在GetT调用之后马上构造其它的局部变量,像下面这样:
LINKINFO* info;
GetT(&info);
char killStack[128] = "abc"; // 加一个干扰变量
cout << info[4].b << endl;

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧