C++ const char *返回值问题
今天写代码,遇到一个const char *返回值的问题,记录一下
问题场景:我写了一个动态库,有个函数声明如下:
;
函数定义如下:
const char * HttpRequestImpl::RGetAppToken(char * appToken, const char * userAccount, const char * userId)
{
std::string message;
// 省略中间逻辑... message = GetAppToken();
return message.c_str();
}
然后通过控制台程序调用改动态库函数如下:
std::string message; memset(appToken, , ); message = httpRequest->RGetAppToken(appToken, userAccount.c_str(), accountId.c_str()); cout << "message: " << message; cout << "\tappToken: " << appToken << endl;
结果在这里遇到一个奇怪的问题,当函数定义中 std::string message; 这句话只有被放在函数开头,或者直接返回字符串字面量时,调用处才能拿到返回值。
如果该句代码被放在函数中间其他地方,或和其他变量一起定义(std::string str, message),或直接写成 std::string message = GetAppToken(),调用处都拿不到返回值。
我的理解:
这种现象是由函数的执行过程导致的,由于函数中的局部变量在栈中存储,按照栈先进后出的原则,先执行的先入栈,后执行的后入栈。
所以当 std::string message; 放在函数开头时,会被在栈的最底部分配一块内存存储,而函数执行完毕,执行return返回时,栈最底部的内存刚好没有释放,从而被拷贝返回了出去。
return 返回一个常量字符串也是这个道理,因为常量字符串只有在执行return语句时才存在,结束后释放。
而 std::string message 放在除函数开头外的其他地方时,会被存在栈的相对中间位置,在return时已经释放掉了,所以返回的只是一个空字符串。
学识浅薄,不得其解,哪位前辈如有答案,还请不吝赐教。
C++ const char *返回值问题的更多相关文章
- c#调用c++开发的dll const char* 返回值接收问题
原文:c#调用c++开发的dll const char* 返回值接收问题 用c#调用视频接口相关的dll,dll使用c++开发. c++接口定义如下: PLATFORM const char* Pla ...
- C++以const 作为返回值类型的意义
const rational operator*(const rational& lhs, const rational& rhs); 很多程序员第一眼看到它会纳闷:为什么operat ...
- const引用返回值
一.引用 引用是别名 必须在定义引用时进行初始化.初始化是指明引用指向哪个对象的唯一方法. const 引用是指向 const 对象的引用: ; const int &refVal = iva ...
- 再分析 返回值加引用&,const
本文主要分析,返回&,和返回值加const的作用. 返回& 定义一个数组模板: template<class T>class Array{ enum{size = 100} ...
- C语言执行时报错“表达式必须是可修改的左值,无法从“const char [3]”转换为“char [120]” ”,原因:字符串不能直接赋值
解决该问题的方法:使用strcpy函数进行字符串拷贝 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string ...
- C++ const修饰函数、函数参数、函数返回值
const修饰函数 在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数.为什么不能调用非const函数?因为非const函数可能修改数据成员,cons ...
- const参数,const返回值与const函数
在C++程序中,经常用const 来限制对一个对象的操作,例如,将一个变量定义为const 的: const int n=3; 则这个变量的值不能被修改,即不能对变量赋值. const 这个关键字 ...
- 函数返回值为 const 指针、const 引用
函数返回值为 const 指针,可以使得外部在得到这个指针后,不能修改其指向的内容.返回值为 const 引用同理. class CString { private: char* str; publi ...
- getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析
2013-07-18 21:35:58 getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析. char是字符型数 ...
随机推荐
- FastDFS 原理介绍
1 功能简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适 ...
- webapi+Quartz.NET解决若干定时程序同时运行的问题
项目现状: 有若干定时程序需要自启动运行,为了简便程序部署等问题,采取这种办法把定时程序集中管理到webapi中跟随api发布 代码架构介绍: 新建一个类库,类库引用Quartz(Quartz.2.3 ...
- pycharm(迅雷下载链接)
pycharm2020迅雷下载链接: https://download.jetbrains.com/python/pycharm-professional-2019.3.3.exe?_ga=2.146 ...
- 如何利用Azure DevOps快速实现自动化构建、测试、打包及部署
前两天有朋友问我,微软的Azure好用吗,适不适合国人的使用习惯,我就跟他讲了下,Azue很好用,这也是为什么微软云营收一直涨涨涨的原因,基本可以再1个小时内实现自动化构建.打包以及部署到Azure服 ...
- apue 外传
先上目录 chapter 3 [apue] dup2的正确打开方式 chapter 10 [apue] 等待子进程的那些事儿 chapter 14 [apue] 使用文件记录锁无法实现父子进程交互执行 ...
- 7.python虚拟环境详解
1.为什么创建虚拟环境? 和其他大多数现代编程语言一样,Python对包和模块的下载.存储以及管理有其自己的一套方法,Python的包一般都存在几个特定的地方,大部分系统包会存在sys.prefix指 ...
- 部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了
部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了 安大虎 momenta 中台开发工程师 6 人赞同了该文章 就目前的形势看,一家公司的运维体系不承载在 Do ...
- js对象模型1
- vue中报错Do not use built-in or reserved HTML elements as component id details
原因是定义了一个叫做details的comonent 跟现有的html网页中的标签重合 export default { name: 'details', data () { return { equ ...
- window10家庭版解决IIS中万维网服务的安全性中无Windows身份验证
首先在左下角输入cmd搜索->命令提示符->以管理员身份运行->然后复制下面一段命令: dism /online /norestart /add-package:%SystemRoo ...