cout输出字符指针
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cout输出字符指针相关的知识,希望对你有一定的参考价值。
有三个函数:
char* f1()
return "abc";
char* f2()
char* ret = "abc";
return ret;
char* f3()
char ret[] = "abc";
return ret;
int main()
cout << f1() << endl;
cout << f2() << endl;
cout << f3() << endl;
main函数前面两行可以正确输出abc,但是第3个行输出的是乱码,这是为什么呢?
(注:第3个函数有一行警告:warning C4172: returning address of local variable or temporary)
f1返回一个字符串的首地址,这个字符串由编译程序保存在程序的初始化段中,这个段中一般保存你程序中出现的常量;
f2的ret变量保存的仍然是初始化段中的字符串首地址;
f3在堆中临时申请了一个数组,并由系统将初始化段中的字符串赋值到这个数组,现在f3返回的地址位于堆中,在f3执行结束后,堆中申请的这个字符串数组ret被释放,堆又开始为cout服务,申请的存储区会覆盖原来的ret位置,所以出现乱码一点也不奇怪。 参考技术A 只有f(1)是正确的,f(2)也输出了abc那是你的运气好,刚好那里的数据还没有被系统改写,一般情况下f(3)那样输出乱码才是正常的。因为f(2)、f(3)都犯了C之大忌:“返回了局部变量或临时变量的地址”。因为当这些指针被返回时,它所指向的内存空间已被系统“回收”走了…… 参考技术B f3函数中,数组ret是临时变量,函数结束后回收临时变量资源。
warning的意思也是说,警告你返回的是临时变量地址。
所以return的ret是垃圾数据,会输出乱码。 参考技术C 警告C4172:返回局部变量或临时变量的地址
话说得很明显了,局部变量的生命期只持续到函数结束,在函数外使用自然会导致错误追问
f1返回的是常量,先不去考虑。但是f2返回的也是局部变量,为什么他就可以正确输出呢?
追答f2跟f1是一个意思,都是返回常量"abc"的地址,而字符串常量的生命期一直持续到程序结束,所以f2是没问题的
怎么用cout输出string的中文字符
c++中,可以直接利用string及cout进行中文的存储及输出:代码如下:
#include <iostream>#include <string>using namespace std;
void main() string s1="第一"; cout<<s1<<endl;
结果:正常输出:第一
但是有些时候不得不用到wstring来存储中文字符,这时输出需要
导入locale头文件
中文字符前需要加L,并用wstring存储
输出前更改本地语言,wcout.imbue(locale("chs"))
用wcout输出
代码如下:
#include <iostream>#include <string>#include <locale>using namespace std;
void main() string s1="第一"; wstring s2=L"第二"; cout<<s1<<endl; wcout.imbue(locale("chs")); wcout<<s2<<endl;
结果如下:
第一
第二 参考技术A c++在windows下cout不能输出中文的处理方法很简单,要做两步:
1、在编译器中设置编码方式为"system"或"GB2312"或"GBK";
2、在要输出中文的语句前加入" \b"即"空格\b",例如我要用cout输出"你好,中文",则程序可以这样写,如下;
#include<iostream>
using namespace std;
int main(void)
cout<<" \b你好,中文"<<endl;
return 0;
这样就能在cout中输出中文了;
以上是关于cout输出字符指针的主要内容,如果未能解决你的问题,请参考以下文章