都是在栈上分配的内存,为什么有输出乱码的,有的不输出乱码

ToConnection 2015-06-06 01:03:35
char * getBuf()
{
char buf[10]="abcd";
return buf;
}

int getAA1()
{
int a ;
a = 10;
return a;
}

void main()
{
cout<<getBuf()<<endl;
cout<<getAA1()<<endl;
system("pause");

}

getBuf()输出的是乱码,因为buf是在栈上分配的临时内存,为什么getAA1() 输出的不是乱码呢?
...全文
328 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
libraacrab 2015-06-11
  • 打赏
  • 举报
回复
第一个返回的指针在函数结束后指向的内存就销毁了,所以再去输出就会乱码,第二个返回的是拷贝的数值,原来的内存虽然销毁了,但是不影响现在的值,是分开的,这两个都涉及到变量的生存周期
xiaohuh421 2015-06-11
  • 打赏
  • 举报
回复
函数返回了一个栈上分配的指针, 那输出内容是什么, 就不敢保证了. 这样的用法是错的. 而返回一个基本数据类型或者对象时, 会有拷贝数据.
worldy 2015-06-11
  • 打赏
  • 举报
回复
char * getBuf() { char buf[10]="abcd"; return buf;//返回或,buf就补存在了 } ---
赵4老师 2015-06-07
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
苏叔叔 2015-06-06
  • 打赏
  • 举报
回复
即使没有出错,也是侥幸,请不要这么干
mewiteor 2015-06-06
  • 打赏
  • 举报
回复
LZ你把第二个函数改成返回a的地址,也就是return &a,返回类型改成int*,最后主函数输出返回的地址指向的值,输出就和第一个函数的情况一样了。
ToConnection 2015-06-06
  • 打赏
  • 举报
回复
1. 指向数字的,把值复制一下,复制到哪里了? 2.假如用一个变量,把指针接一下,就能正确输出? char bufTemp[10]; strcpy(bufTemp,getBuf()); cout<<bufTemp<<endl;
ToConnection 2015-06-06
  • 打赏
  • 举报
回复
1. 指向数字的,把值复制一下,复制到哪里了? 2.假如用一个变量,把指针接一下,就能正确输出?
羽飞 2015-06-06
  • 打赏
  • 举报
回复
楼主的两个函数返回值都是按值返回的,第一个是一个指针,第二个是数字 指针指向的内存块在栈上,函数返回,栈就没有了,另一个是数字,把值复制一下,还能打印,并且是正确的,而且打印的不是那个函数栈上的内存的内容

64,691

社区成员

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

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