有关栈、堆内存的一道笔试题目

请分析下面代码运行是否有问题,如果有问题请改正
#include <iostream>
using namespace std;
char* GetMemory(void)
{
char p[] = "Hello world";
return p;
}
int main()
{
char* str = GetMemory();
cout<<str;
return 0;
}
测试结果:


#C/C++##笔试题目#
全部评论
GetMemory函数的变量p是数组,在栈上,函数调用结束时会自动回收。所以要么在GetMemory函数内动态申请内存,然后由调用者来释放。要么在数组p定义为static的,在初始化之后一直存在直到程序运行完毕。 不过栈上的回收也只是移动栈指针而已,所以数据还在,只是可能被新的栈上数据覆盖。我在自己机器上实验发现GetMemory返回的是NULL(0x0),不知道是C标准规定的还是gcc优化的。
点赞 回复 分享
发布于 2018-06-28 14:26
这个知识点考查的是: char p[] = "aaa"; 和 char *p = "aaa";的区别。 前者等效于char p[] = {'a','a','a','\0'};,即创建了一个数组,由于p数组是局部变量,保存在栈空间,所以跳出函数后内存被释放因此出错。后者是先在静态存储区开辟内存存放"aaa",然后指针指向该内存地址,所以跳出函数后"aaa"依然保持在静态存储区中,用函数外的指针依然能访问内容"aaa"。 可以正确执行的代码如下: 参考: https://blog.csdn.net/fly__chen/article/details/52777054
点赞 回复 分享
发布于 2018-06-28 14:23

相关推荐

11-01 08:48
门头沟学院 C++
伤心的候选人在吵架:佬你不要的,能不能拿户口本证明过户给我。。球球了
点赞 评论 收藏
分享
11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
点赞 3 评论
分享
牛客网
牛客企业服务