c++ --> 返回值分析
返回值分析
函数不能通过返回指向栈内存的指针,返回指向堆内存的指针是可以的。
一、返回局部变量的值
可以有两种情况:返回局部自动变量和局部静态变量,比如:
int func()
{
int temp = ; // 返回局部自动变量的值,没问题
return temp;
}
局部变量temp存储在栈中,函数返回时会自动复制一份temp的copy给调用者,没有问题。
int func()
{
static int a = ; // 返回局部静态变量的值,没问题
return a;
}
局部变量a存储在静态(全局)存储区中,仅分配一次内存,并且函数返回后,变量不会销毁,没有问题。
vector<int> func()
{
vector<int> v;
v.push_back();
return v; //返回v的值拷贝,没问题
}
Person func()
{
Person p1;
p1.name = "test";
return p1; //返回值拷贝,会调用person类的拷贝构造函数,没问题
}
二、返回局部变量的指针
int* func()
{
int temp = ; //返回局部变量的地址
return &temp; //返回时讲已销毁的地址返回给调用者,结果不可预知
}
int* func()
{
static int temp = ;
return &temp; //返回指向静态存储区变量的指针, 没问题
}
char* func()
{
char *p = "test";
return p; //由于字符串test存储在常量存储区(不是静态存储区),返回一个指向常量的字符串指针是可行的。
}
char* func()
{
char str[] = "test";
return str; //函数返回一个已销毁的局部变量是不可行的。解决办法就是将字符串str声明为static。
}
char* func()
{
char *str = (char *)malloc(sizeof(char) * BUFFER_SIZE);
strcpy(str, "test");
return str; //函数返回一个指向堆内存的指针,由于堆存储区由程序员手动管理,可行的,但是要防止出现内存泄露,函数调用完后需要手动释放内存。
} char *temp = NULL;
temp = func();
// some operation...
free(temp);
三、返回局部变量的引用
int& func()
{
int temp = ; //返回局部变量的引用
return temp; //返回的temp本身,但已销毁,结果不可预知
}
四、静态全局变量和全局变量的区别
静态全局变量只在当前文件中可用,全局变量在其他文件中也可用,需要用extern声明。全局变量和静态变量如果没有手动初始化,则默认由编译器初始化为0。
#include <stdio.h>
char *returnStr()
{
char *p="hello world!"; //hello world!"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针
return p; //返回没问题
}
int main()
{
char *str;
str=returnStr();
printf("%s\n", str);
return ;
}
#include <stdio.h>
char *returnStr()
{
char p[]="hello world!"; //"hello world!"是局部变量存放在栈中。当returnStr函数退出时,栈要清空,局部变量的内存也被清空了
return p;
}
int main()
{
char *str;
str=returnStr();
printf("%s\n", str); //打印可能是乱码
return ;
}
int func()
{
int a;
....
return a; //允许
} int * func()
{
int a;
....
return &a; //无意义,不应该这样做
}
由于a返回的是值,无论是自动还是静态,返回局部变量的值是没有问题的;返回指向局部变量的指针,在调用结束后局部自动变量被销毁,指针指向一个不存在的对象,返回无意义。
#include <stdio.h>
char *returnStr()
{
static char p[]="hello world!"; //如果非要返回一个局部变量的地址,那么该局部变量一定要申明为static类型
return p;
}
int main()
{
char *str;
str=returnStr();
printf("%s\n", str);
return ;
}
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p; //返回指向堆内存的指针是可以的
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3();
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
c++ --> 返回值分析的更多相关文章
- linux recv函数返回值分析
函数原型: ssize_t recv(int sockfd, void *buf, size_t len, int flags); 该函数第一个参数制定接收端套接字描述符; 第二个参数指明一个缓冲区, ...
- arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值
环境及代码介绍 环境和源码 由于有时候要透彻的理解C里面的一些细节问题,所有有必要看看汇编,首先这一切的开始就是从汇编代码进入C的main函数过程.这里不使用编译器自动生成的这部分汇编代码,因为编译器 ...
- 再分析 返回值加引用&,const
本文主要分析,返回&,和返回值加const的作用. 返回& 定义一个数组模板: template<class T>class Array{ enum{size = 100} ...
- getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析
2013-07-18 21:35:58 getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析. char是字符型数 ...
- springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)
之前两篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)和springMVC源码分析--HandlerMethodReturnValu ...
- springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)
在上一篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)我们介绍了返回值解析器HandlerMethodReturnValueHand ...
- 分析RunTime执行命令以及得到返回值
RunTime执行命令得到返回值 我们有在好好几篇博客里提到过RunTime,比如 JAVA之旅(二十三)--System,RunTime,Date,Calendar,Math的数学运算 Androi ...
- 字节码分析finally块对return返回值的影响
直接进入主题.看如下代码: public int test(){ int i=0; try { i=1; return i; } catch (Exception e) { i=2; return i ...
- 源码分析springboot自定义jackson序列化,默认null值个性化处理返回值
最近项目要实现一种需求,对于后端返回给前端的json格式的一种规范,不允许缺少字段和字段值都为null,所以琢磨了一下如何进行将springboot的Jackson序列化自定义一下,先看看如何实现,再 ...
随机推荐
- CIF、DCIF、D1分辨率是多少?
CIF简介: QCIF全称Quarter common intermediate format.QCIF是常用的标准化图像格式.在H.323协议簇中,规定了视频采集设备的标准采集分辨率.QCIF = ...
- 错误号码2003 Can't connect to MySQL server 'localhost' (0)
错误描述 错误原因 最近,我一直都可以用SQLyog连接本地数据库,但是近几天却无法连接:并且一直都报上述错误,我查阅了很多资料,发现有很多中说法 总结一下 第一,MySQL中的my.ini出错: 第 ...
- BFS-九宫格重排(详解)
BFS将近两年没练过题了,今天重新回忆下以前刷的蓝桥杯题:九宫格重排 样例输入 //初始状态 //终点状态 样例输出 //最短步数 样例输入 //初始状态 //终点状态 样例输出 //最短步数 ...
- 【BZOJ4816】数字表格(莫比乌斯反演)
[BZOJ4816]数字表格(莫比乌斯反演) 题面 BZOJ 求 \[\prod_{i=1}^n\prod_{j=1}^mf[gcd(i,j)]\] 题解 忽然不知道这个要怎么表示... 就写成这样吧 ...
- 【LightOJ1282】Leading and Trailing(数论)
[LightOJ1282]Leading and Trailing(数论) 题面 Vjudge 给定两个数n,k 求n^k的前三位和最后三位 题解 这题..真的就是搞笑的 第二问,直接输出快速幂\(m ...
- [ZJOI2007]时态同步
题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...
- centos7.2 配置内网ntp服务器进行时间同步
(一)修改/etc/ntp.conf 配置文件,注意红色部分,其他部分不需要改 ########################################################### ...
- 构造方法里的super()方法
为什么经常会遇到有的构造函数会有super(),而有的却没有,其实super就比如 对数函数,log的底数为10,如果为10 ,我们可写可不写,如果不为10,那么我们就要加上底数 在子类构造方法中,s ...
- C++学习-3
引用与函数指针: 函数指针就是把函数名挖掉变成*p 函数指针的类型就是把p去掉 函数指针的引用(引用就是在类型和名字的中间加&) 函数指针加一个()就成调用函数了-----------p() ...
- 与二叉树有关的编程题的Java代码实现
该文章几乎包含了所有与二叉树相关的基础面试题,其中包括二叉树的四种遍历方法:前序遍历,中序遍历,后续遍历,层次遍历. 算法题包括: 二叉树的序列化和反序列化 给定一颗二叉搜索树,请找出其中的第k大的结 ...