博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++函数返回局部变量
阅读量:4663 次
发布时间:2019-06-09

本文共 1820 字,大约阅读时间需要 6 分钟。

函数不能返回指向栈内存的指针

 

原因:返回值是拷贝值,局部变量的作用域为函数内部,函数执行结束,栈上的局部变量会销毁,内存释放。

可返回的局部变量:

 1. 返回局部变量本身       

int sum(int a, int b){    int s=a+b;    return s;}
View Code

 

2.常量:

char* returnValue()  {      char* str="HelloJacky";      return str;  }

 char * str=“hello world”字符串常量,不能str[1]='a'. 常量不能修改。 这种语法是为了兼容c代码。“hello world” 是const char * 类型。然后将char * 指向存储的位置。使用C++编译器会有警告提示:

warning:
deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
推荐把类型修改为const char *
也就是说,这种语法的存在,只是为了保证以前的C代码可以正常编译。
 
//错误char* returnValue()  {      char str[]="HelloJacky";      return str;  }

str 为局部变量

3. 静态局部变量

当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

//正确 char* returnValue()  {      static char str[]="HelloJacky";      return str;  }

强制定义为静态类型;

int* returnValue()  {      static int value[3]={
1,2,3}; return value; }

数组名是不就变量的首地址,加上static 可以

 

4. 堆内存中的局部变量

//正确 int *sum(int a, int b){    int *s=new int();    *s=a+b;    return s;}
char* newMemory(int size)  {      char* p=NULL;      p=new char[size];      return p;  }  int _tmain(int argc, _TCHAR* argv[])  {      char* p=newMemory(2);      if(p!=NULL)      {          *p='a';      }      std::cout<<*p;      delete [] p;      return 0;  }

在函数内new空间,在函数外delete空间。函数内申请空间,调用后释放空间。但这不是一种好的编程习惯,尽量在同一作用域内进行new和 delete操作。接口不灵活

 

五大内存分区(貌似与编译原理中不一样,不过道理是一样的,实际存在的东西总是会与理论有一定差距的)

1.在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
2.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
3.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
4.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
5.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
6.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

 

转载于:https://www.cnblogs.com/fanhaha/p/7117766.html

你可能感兴趣的文章
java常见异常
查看>>
手动添加PopMenu出现的问题
查看>>
Linux 远程桌面 访问 WIndows
查看>>
SQLServer存储过程自制数据字典
查看>>
TCP的粘包问题
查看>>
树上有十只鸟,开枪打死一只,还剩几只?
查看>>
随机生成汉字(摘录保存的代码)
查看>>
敢于面对惨淡的人生
查看>>
【bzoj 1119】 [POI2009] SLO(置换群)
查看>>
leetcode[19]Remove Nth Node From End of List
查看>>
Spring 系列: Spring 框架简介
查看>>
DataTable转换成IList
查看>>
web开发的模式
查看>>
【深入ASP.NET原理系列】--Asp.Net Mvc和Asp.Net WebForm实际上共用一套ASP.NET请求管道...
查看>>
Windows下搭建PHP开发环境(Apache+PHP+MySQL)
查看>>
做产品原型设计有哪些需要注意的问题——吐槽下目前产品需求原型一直以来被前端诟病的地方...
查看>>
mysql 中的存储过程
查看>>
IP协议详解
查看>>
TCP协议详解
查看>>
vscode如何使用?常用插件有哪些?
查看>>