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

请分析下面代码运行是否有问题,如果有问题请改正
#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++
伤心的候选人在吵架:佬你不要的,能不能拿户口本证明过户给我。。球球了
点赞 评论 收藏
分享
评论
点赞
3
分享
牛客网
牛客企业服务