关于函数内局部变量是否在函数调用完成后是否释放的问题。

鼓手 2005-10-05 08:19:32
#include <iostream.h>

char* new1();

void main()
{
char* p;
p=new1();
if(p != NULL)
cout<<*p<<endl;
else
cout<<"b"<<endl;

}
char* new1()
{
char* pt;
char array='c';
pt=&array;
return pt;
}
上面的代码在VC++6.0下编译通过。
我输出的结果是c。但是根据书中给出的说明应该是b。
请各位给出问题所在!
...全文
1314 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
鼓手 2005-10-06
  • 打赏
  • 举报
回复
谢谢各位的帮助。

特别是xteaj(半桶水)的说明和hawk_1982()的例子。
zhouhuahai 2005-10-06
  • 打赏
  • 举报
回复
xteaj(半桶水)
的解答有说服力.

楼主可以再定义一个函数.在其中再定义一些局部变量.结果可能就不同了.
因为它们(函数)的内部变量的入栈地址可能相同.
youngdreamer2008 2005-10-06
  • 打赏
  • 举报
回复
char *GetMemory(void)

{

char *p = "hello world";//改成char*p就ok了,因为“hello world”变成了常量字符串

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}
youngdreamer2008 2005-10-06
  • 打赏
  • 举报
回复 1
happydivid(泓笑) 回答的好!!!
如果是我们自己malloc或new一定要有free,delete,而且还要有p=NULL,好习惯,防止产生悬挂指针(野指针),这里注意,即使你free或delete了,这个指针p还是存在的,只是他指向的空间被没收了,而且这个空间没收后也可能闲置未动,就会出现输出'c'的现象,拙见!!!哈哈
DeliphZhang 2005-10-05
  • 打赏
  • 举报
回复
我想可以在函数内部加上一个限定词static 就不会出现你说的那种情况,即在函数内申明的局部变量就会保留其值,当函数调用完这个局部变量不会被销毁
DeliphZhang 2005-10-05
  • 打赏
  • 举报
回复
这个程序可以得到c字符,我是在Linux下编译的,编译器是gcc,
lilinll77 2005-10-05
  • 打赏
  • 举报
回复
野指针啊
阜哥 2005-10-05
  • 打赏
  • 举报
回复
《C++程序设计教程》作者钱能,清华大学出版社
这本书很好。
推荐楼主看看
qinxiaolin 2005-10-05
  • 打赏
  • 举报
回复
#include <iostream.h>

char* new1();

void main()
{
char* p;
p=new1();
if(p != NULL)//这里是不能判断出来的
cout<<*p<<endl;
else
cout<<"b"<<endl;

}
char* new1()
{
char* pt;
char array='c';
pt=&array;
return pt;//这里虽然是将array的地址返回给指针p了,但是函数返回后,局部变量array被释放(只是并没有将其存储单元的值擦除),虽然输出的是c,但是其存储的内容是不确定的,不信你在 p=new1(); 之后加一个new 操作,比如 char *a=new char[2];p指向的存储单元的值将改变成一个不确定的值.
}
  • 打赏
  • 举报
回复
答案可能是c。函数返回时,pt的内容并没有改变,即pt所指的地址没变。
传回去之后p所指的地址与原pt所指的地址没变。p的内容应该不是NULL。
因为本程序很简单,所以p所指地址内的内容应该也没有改变。不过编译系统
会不会重新布置内存空间就不一定了。答案是c的可能性较大。如果程序复杂
一点就不好说了。反正这是一个明显的“野指针”,自己编程是要杜绝此类情况的发生。
xiaocai0001 2005-10-05
  • 打赏
  • 举报
回复
vc++6.0有问题,编译不出Release 版本来

---------------
需要对环境设置一下
snowbirdfly 2005-10-05
  • 打赏
  • 举报
回复
那建议看一下<<C++ Primer Plus>>
很容易上手~~
网上有好多电子图书~
要是找不到,发个短信找我要就行了~~~
鼓手 2005-10-05
  • 打赏
  • 举报
回复
西安电子科技大学出版社出版的《c++ 程序设计语言》 主编: 揣锦华 副主编:李军民

大家推荐一本好点的初级教程。

调试的时候还是不行。vc++6.0有问题,编译不出Release 版本来。
hawk_1982 2005-10-05
  • 打赏
  • 举报
回复
出一道经典的指针题给楼主,弄清楚了,关于这个帖子的问题你也就清楚了
char *GetMemory(void)

{

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}


请问运行Test函数会有什么样的结果?
snowbirdfly 2005-10-05
  • 打赏
  • 举报
回复
楼主你看的书应该有问题~~~
不知道你看的是什么书???
鼓手 2005-10-05
  • 打赏
  • 举报
回复
谢谢各位,我先调试下!
MoriyaLB 2005-10-05
  • 打赏
  • 举报
回复
p=newl(),无论指向的是否有意义,NULL != p都是判断不出来的
所以肯定结果不会是b,你看的什么书?建议别看了
xlsue 2005-10-05
  • 打赏
  • 举报
回复
同意楼上的说法。
xiaocai0001 2005-10-05
  • 打赏
  • 举报
回复
上面的代码在VC++6.0下编译通过。
---------------------
你可以将程序编译成Release版本, 再看看结果.

从根本上说, 此问题的输出是未知的.

newl()返回的是一个无效的地址, 那么这个地址内将有什么内容将不可预测.
happydivid 2005-10-05
  • 打赏
  • 举报
回复
#include <iostream.h>

char* new1();

void main()
{
char* p;
p=new1();
if(p != NULL)
cout<<*p<<endl;
else
cout<<"b"<<endl;

}
char* new1()
{
char* pt;
char array='c';
pt=&array;
return pt;
}
return后,array字符变量与pt指针变量都被释放。但return的地址值还是c字符存放的地址,而这个存储单元在没有被再次存放数据前,它的内容是不会改变的,也就是在return后这个存储单元存储的还是字符'c'.
加载更多回复(2)
内容概要:本文介绍了一种基于PSO-RNN-GAN混合智能算法的无人机三维路径规划模型,结合粒子群优化算法(PSO)的全局搜索能力、循环神经网络(RNN)的时序建模优势以及生成对抗网络(GAN)的路径生成能力,在MATLAB平台上实现了复杂三维环境中高效、平滑、低能耗且具备动态避障能力的路径规划系统。文中详细阐述了模型架构,包括三维环境建模、PSO路径搜索、RNN路径平滑、GAN路径创新生成、多目标损失优化及自适应调度机制,并提供了关键模块的代码示例与仿真可视化方法,支持多无人机协同扩展,具备良好的泛化性与工程应用前景。; 适合人群:具备一定机器学习与优化算法基础,从事无人机导航、智能控制、路径规划相关研究或开发工作的科研人员与工程师,尤其适合研究生、算法研发人员及自动化、航空航天领域从业者; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航路径规划,实现高效避障与节能飞行;②为动态障碍、多目标优化、路径平滑性与动力学约束等问题提供综合性解决方案;③作为智能交通、多智能体协同、自动驾驶等领域路径决策系统的参考模型; 阅读建议:此资源以MATLAB实现为核心,包含模型设计与部分代码,建议读者结合文中架构图与代码片段搭建仿真环境,逐步复现并调试各模块功能,重点关注多算法融合机制与损失函数设计,深入理解PSO、RNN、GAN在路径规划中的协同作用。
内容概要:本文介绍了一种基于两阶段鲁棒优化算法的微网多电源容量配置方法,并提供了完整的Matlab代码实现。该方法针对微电网中风能、光伏、储能等多种分布式电源的容量规划问题,充分考虑了可再生能源出力与负荷需求的不确定性,通过构建两阶段鲁棒优化模型,在第一阶段确定电源的最优配置容量,在第二阶段应对实际运行中的不确定因素,从而提升系统运行的经济性与可靠性。文中详细阐述了模型构建过程、不确定性集合的设定、列与约束生成(C&CG)算法的求解流程,并结合算例验证了所提方法的有效性和鲁棒性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事微电网、综合能源系统、可再生能源集成等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习和掌握两阶段鲁棒优化理论在电力系统规划中的具体应用;② 理解并复现微网多电源容量配置的建模与求解全过程;③ 将该方法迁移应用于类似的能源系统优化问题,如储能配置、配电网络规划等。; 阅读建议:建议读者结合Matlab代码逐行理解算法实现细节,重点关注不确定性建模与C&CG算法的迭代求解过程,有条件者可尝试修改算例参数或引入新的电源类型以深化理解和应用能力。

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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