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输出字符指针的主要内容,如果未能解决你的问题,请参考以下文章

cout输出字符串前几位

c++怎么用cout输出字符串?

关于C++用cout输出字符串

为啥c++中无法用cout输出字符串

C++中cout<<字符数组名;为啥能输出字符串?

C++ 打印指针