VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 611|回复: 6

[求助] C++字符串字面值常量

[复制链接]
07_avatar_middle
在线会员 Acher陈 发表于 2018-2-12 21:05:17 | 显示全部楼层 |阅读模式
3驿站币
首先本文的对象是这么一段代码:

char * getResult0()  
{  
    char *s = "This is a string";  
    return s;  
}  

char * getResult1()  
{  
    char s[] = "This is a string";  
    return s;  
}  
函数getRsult0返回的是字面值字符数组,函数getResult1返回的是静态数组。知识有限,能不能解释一下这个是什么意思呢?稍微通俗点。谢谢啦

最佳答案

查看完整内容

正常情况getResult0()是没问题的,char *s数据保存在常量区,在数据返回的时候保存了一份副本,返回后s变量销毁,但常量区的数据不受影响,而getResult1()就不一样了,他的数据保存在栈上,函数一返回,栈上的数据就销毁了.




上一篇:字符串数组指针问题以及字符串初始化问题
下一篇:openprocess这个函数为什么我在控制台下可以用,但是到了窗口程序中却不可以用,为...

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

22_avatar_middle
在线会员 wwhwayne 发表于 2018-2-12 21:05:18 | 显示全部楼层
正常情况getResult0()是没问题的,char *s数据保存在常量区,在数据返回的时候保存了一份副本,返回后s变量销毁,但常量区的数据不受影响,而getResult1()就不一样了,他的数据保存在栈上,函数一返回,栈上的数据就销毁了.

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

01_avatar_middle
online_admins admin 发表于 2018-2-12 21:18:34 | 显示全部楼层
这两个都是错误的写法,在 getResult0 或者 getResult1 函数执行完毕之后,局部变量的字符串都可能被释放了,所以在函数外面访问是不行的,即使凑巧没被释放也是非常不安全的,如果一个函数要返回一个指针类型,最好在函数内部 new 出来,这样才安全。不过别忘了在调用该函数的地方使用完这个指针之后要delete啊

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

07_avatar_middle
ico_lz  楼主| Acher陈 发表于 2018-2-13 14:31:57 | 显示全部楼层
admin 发表于 2018-2-12 21:18
这两个都是错误的写法,在 getResult0 或者 getResult1 函数执行完毕之后,局部变量的字符串都可能被释放了 ...

谢谢,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-2-23 16:05:50 | 显示全部楼层
wwhwayne 发表于 2018-2-23 15:55
正常情况getResult0()是没问题的,char *s数据保存在常量区,在数据返回的时候保存了一份副本,返回后s变量销 ...

没错,刚刚再次确认了下,正如 @wwhwayne 所说,getResult0 中的 "This is a string" 存在字符串常量区,也就是存储在静态存储区,不会随着函数的退出而释放,而是跟全局变量一样,程序的退出才释放。所以,getResult0 是没有问题的。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

07_avatar_middle
ico_lz  楼主| Acher陈 发表于 2018-3-1 15:11:12 | 显示全部楼层
wwhwayne 发表于 2018-2-12 21:05
正常情况getResult0()是没问题的,char *s数据保存在常量区,在数据返回的时候保存了一份副本,返回后s变量销 ...

非常感谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-8-18 18:28

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表