首页 新闻 会员 周边

printf和cont问题

0
悬赏园豆:10 [已解决问题] 解决于 2019-12-27 21:18
  1. #include<iostream>  
  2. #include<stdio.h>  
  3.   
  4. using namespace std;  
  5.   
  6. int GetA()  
  7. {  
  8.     int a;  
  9.     a = 10;  
  10.     return a;  
  11. }  
  12.   
  13. int& GetA1()  
  14. {  
  15.     int a;  
  16.     a = 10;  
  17.     return a;  
  18. }  
  19.   
  20.   
  21. int main01()  
  22. {  
  23.     int a1 =0;  
  24.     int a2 =0;  
  25.   
  26.     a1 = GetA();  
  27.     a2 = GetA1();  
  28.   
  29.     int &a3 = GetA1();  
  30.   
  31.     //cout<<"a1="<<a1<<" "<<"a2="<<a2<<" "<<"a3="<<a3<<endl;   //a3不会产生乱码,  
  32.     printf("a1:%d \n", a1);  
  33.     printf("a2:%d \n", a2);  
  34.     printf("a3:%d \n", a3);//a3会产生乱码,这两种为什么??????????????  

如31行和32行,使用cont输出不会产生乱码,使用printf输出则会产生乱码,为什么?

c++ c
shell_nut的主页 shell_nut | 初学一级 | 园豆:129
提问于:2019-01-02 16:28
< >
分享
最佳答案
0

因为你的 GetA1() 这个函数返回的是对该函数内临时变量的引用(可以理解为一个指向该变量的指针),因此当 GetA1 返回的时候,这个引用指向的变量,已经在生命周期上是“dead”(或者说,该存储空间可以被再次分配的意思)的状态。
因此本质上并不是 printf 和 cout 之间有什么特别的区别,而是你看到正常的输出,那只是说明你的“运气”比较好,后续的函数调用“未能”复写你的引用指向的内存区域而已。而“乱码”才是你应该认为是你这样定义的函数导致的一种“必然”后果。

收获园豆:4
hoodlum1980 | 小虾三级 |园豆:559 | 2019-01-10 15:31
其他回答(3)
0

string str = "6666666";

cout<<str<<endl;

printf("%s", str.c_str());
因为printf里面要求是char类型,string和char是不一样的

收获园豆:2
waiter | 园豆:1000 (小虾三级) | 2019-01-03 10:24
0

这个代码本身写的就有问题,函数不能返回局部变量的引用,这样的代码没有意义,而且会引起segmentfault

收获园豆:2
dreamingcloud | 园豆:213 (菜鸟二级) | 2019-01-04 17:55
0

因为你 GetA1 函数写错了,返回出了错误,自然就错了

收获园豆:2
Aehnuwx | 园豆:263 (菜鸟二级) | 2019-03-17 19:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册