背景

首先代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include "stdint.h"
#include <windows.h>
#include <tchar.h>
#include <TlHelp32.h>
#include <io.h>
#include <sys/stat.h>using namespace std;
//获取进程个数函数
int GetProcessCount(TCHAR* szExeName)
{//具体代码省略
}int main()
{string ProName = "Agent状态监视软件.exe";TCHAR t_str[200] = { 0 };char str[100] = { 0 };memcpy(str, ProName.c_str(), ProName.length());MultiByteToWideChar(CP_ACP, 0, str, -1, t_str, 200);TCHAR* szExeName = t_str;cout << "进程个数:"<<GetProcessCount(szExeName) << endl;system("pause");return 0;
}

输出很正常,进程个数:1

问题

但是,我想将string 类型转为TCHAR*的操作,封装为函数,方便后续工程使用,修改代码如下:

TCHAR* stringToTCHAR(string str)
{TCHAR wc[200] = { 0 };char mc[100] = { 0 };memcpy(mc, str.c_str(), str.length());MultiByteToWideChar(CP_ACP, 0, mc, -1, wc, 200);TCHAR* szExeName = wc;return szExeName;}int main()
{string ProName = "Agent状态监视软件.exe";TCHAR* szExeName = stringToTCHAR(ProName);cout << "进程个数:"<< GetProcessCount(szExeName) << endl;system("pause");return 0;
}

但是,奇怪的事情发生了。。。。
同样的代码,就封装成了函数,然后,运行结果就差别这么大,运行就出现了下面的结果:

解决方法

经过各种百度尝试失败之后,从内存原理重新梳理代码,发现了问题。**stringToTCHAR()作为一个函数,会在栈上开辟一块空间给wc变量,随着这个函数运行完,开辟的空间也会清空,所以函数中szExeName指向的wc就没啦。**因此,不能这么做,应该在堆上开辟一块持久空间,来存放这个变量。

那么?怎么实现那?在修改后代码如下:

TCHAR* stringToTCHAR(string str)
{TCHAR wc[200] = {0};char mc[100] = { 0 };memcpy(mc, str.c_str(), str.length());int len = MultiByteToWideChar(CP_ACP, 0, mc, -1, wc, 200);//TCHAR* szExeName = wc;TCHAR* szExeName = new TCHAR(200);_tcscpy(szExeName, wc);return szExeName;
}
int main()
{string ProName = "Agent状态监视软件.exe";TCHAR* szExeName = stringToTCHAR(ProName);cout << "进程个数:"<< GetProcessCount(szExeName) << endl;system("pause");return 0;
}

至此,问题成功解决。
代码仍需修改和完善,这里仅作为例子,说明下这种问题如何分析和解决。

C/C++ TCHAR* 作为函数返回值的问题相关推荐

  1. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  2. C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)

    先看以下代码 #include <iostream> #include <string> using namespace std;int main() // main() 是程 ...

  3. C指针7:指针作为函数返回值

    C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> ...

  4. 使用指针做函数返回值

    使用指针做函数返回值 1.当使用指针做为函数的返回值时,主函数处的char *p;将获得调用函数char *pf;的值,即一个地址值,如oxAE72.此时需要我们注意的是该地址值所指向的空间是否存在( ...

  5. python函数用法详解2(变量的作用域(全局变量、局部变量)、共享全局变量、函数返回值、函数的参数(位置参数、关键字参数、默认参数、不定长参数)、拆包、交换变量值、引用、可变和不可变类型)

    1. 变量作⽤域         变量作⽤域指的是变量⽣效的范围,主要分为两类:局部变量和全局变量. 局部变量         定义在函数体内部的变量,即只在函数体内部⽣效. def testA(): ...

  6. python函数的用法详解(作用、定义、调用、函数参数、函数返回值、函数说明文档、函数嵌套使用)

    1. 函数的作⽤ 函数就是将⼀段具有独⽴功能的代码块整合到⼀个整体并命名,在需要的位置调⽤这个名称即可完成对应的需求. 函数在开发过程中,可以更⾼效的实现代码重⽤. 2. 函数的使⽤步骤 2.1 定义 ...

  7. 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)

    2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...

  8. python 函数变量_Python函数中的变量和函数返回值

    1.函数的变量 局部变量和全局变量: Python中的任何变量都有特定的作用域 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量 在一个文件顶部定义的变 ...

  9. python 函数返回值的特殊情况

    今天没事和大家一起聊聊python 函数返回值的特殊情况,之前我也碰到过类似方面的问题,到后来查阅了一些资料后,发现原来是这样! 我记得很久以前和大家聊过python列表操作方法,python列表非 ...

最新文章

  1. C指针笔试题,蛋疼的多重指针运算,谭浩强的阴影
  2. MyFlash——美团点评的开源MySQL闪回工具
  3. 【java笔记】Collections集合工具类
  4. Discuz!模板解析语法
  5. Matlab求解黎卡提方程
  6. OpenHarmony代码下载编译流程记录
  7. MySQL数据库(1)~~一起学习数据库冲冲冲
  8. 通过java解析域名获得IP地址
  9. js中RGB与十六进制颜色转换
  10. Mac恢复被修改的文档
  11. Transition 调用方法分析
  12. STL源码分析之RB-tree关联容器 上
  13. 【JokerのZYNQ7020】INTERRUPT(PL产生,PS处理)。
  14. 【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(1)...
  15. 国内android开发之墙痛,Android面试题-机型适配之痛,例如三星、小米、华为、魅族等。...
  16. Java中file.delete()删除文件失败
  17. Python3 网络爬虫入门与实战
  18. java读取文件按照空格_java实现读取txt文件并以在每行以空格取数据
  19. 计算机水平vb,2020年计算机等级VB考试强化练习题及答案
  20. 用单片机解码红外遥控器

热门文章

  1. 酷睿i7 12800hx和i7 12800H区别
  2. MATLAB浮点数运算精度问题
  3. RAMOS(全内存操作系统)初识----仅供测试
  4. TypeScript+Vue3.0笔记
  5. 【小米刷机流程全攻略】新手必读
  6. pythonnumpy初始化三维数组_numpy中的三维数组
  7. java int 运算符_Java 位运算符和 int 类型的实现
  8. html中加号属性名,HTML标签常见和不常见但常用的属性
  9. DFA算法:简易Java敏感词过滤(含源文件和上万敏感词列表)
  10. 雷军:小米要做成一个爱憎分明的公司