标签:names 接收 c++ 字符 exit 产生 变量的存储 临时对象 初始化
1 //cstdlib 头文件定义了两个预处理变量,分别用于表示程序运行成功和失败: 2 #include <cstdlib> 3 int main() 4 { 5 if (some_failure) 6 return EXIT_FAILURE; 7 else 8 return EXIT_SUCCESS; 9 }
1 // return plural version of word if ctr isn‘t 1 2 string make_plural(size_t ctr, const string &word, 3 const string &ending) 4 { 5 return (ctr == 1) ? word : word + ending; 6 } /*我们可以使用这样的函数来输出单词的单数或复数形式。这个函数要么返回其形参 word 的副本,
要么返回一个未命名的临时string 对象,这个临时对象是由字符串 word 和 ending 的相加而产生的。
这两种情况下,return 都在调用该函数的地方复制了返回的 string 对象。*/
1 // find longer of two strings 2 const string &shorterString(const string &s1, const string &s2) 3 { 4 return s1.size() < s2.size() ? s1 : s2; 5 }
1 #include<iostream> 2 using namespace std; 3 int& func() 4 { 5 int a = 55; 6 cout << "函数里面a的地址:" << &a<<endl; 7 return a; 8 } 9 int main() 10 { 11 int c = func(); 12 cout << "函数返回值地址:"<< &c <<endl; 13 cout << c; 14 return 0; 15 }
//以上情况c的值为55,地址变了
可见这样接收返回的局部变量的引用可以把它的值保留下来
1 #include <iostream> 2 using namespace std; 3 int &c() 4 { 5 int a=5; 6 cout <<&a <<endl; 7 return a; 8 } 9 int main() 10 { 11 int *b; 12 b = &c(); 13 cout << b << endl; 14 cout << *b << endl;//如果是cout << b << *b << endl; 又会发现*b==5? 15 return 0; 16 }
内存被释放
不要返回局部变量的指针
1 #include <iostream> 2 using namespace std; 3 int *c() 4 { 5 int a=5; 6 cout <<&a <<endl; 7 return &a; 8 } 9 int main() 10 { 11 int *b = c(); 12 cout << *b << endl << b << endl; 13 cout << *b << endl; 14 return 0; 15 }
第一次输出的时候*b是函数局部变量原来的值
如果第一次输出地址,后面输出*b是位置的
在输出前先输出一个无关的变量(a),后面又指向未知了,所以说出现上面的情况
应该是因为函数执行完后输出的返回值的时候局部变量还没有来得及释放
尝试用一个变量将还没有释放的内存里的值保存下来
1 #include <iostream> 2 using namespace std; 3 int &get(int *arry, int index) { return 4 arry[index]; } 5 int main() { 6 int ia[10]; 7 for (int i = 0; i != 10; ++i) 8 { 9 get(ia, i) = 2; 10 cout << ia[i]; 11 } 12 }
标签:names 接收 c++ 字符 exit 产生 变量的存储 临时对象 初始化
原文地址:https://www.cnblogs.com/2020R/p/13178168.html