关于函数返回值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于函数返回数组指针的问题
关于函数返回值的问题,其实对于这个问题的考虑是因为前段时间中遇到了,而且说实在的其实在认真调查了一下,才发现其实这个问题可以归纳为函数变量的生命周期问题。
先来说说我的问题,具体例子如下:
unsigned char Encode(unsigned char ramdata, unsigned char const *keydata)
{
unsigned char ramkey[6];
unsigned char *p;
………………
Return P;
}
高手可能一眼就看出问题了,我由于长时间没接触,这段时间才重新开始接触,再加上指针学的不好,就没注意,还有就是看公司代码造成的误解。接下来说说具体问题出在哪里。
问题1:返回值是一个指针,但是局部变量的指针的生命周期,在函数结束时,指针的生命周期也结束了,系统会把局部变量指针的空间回收,如果在调用这个返回值就会出问题,这个指针是一个野指针,这里要注意一点的是有一些编译器因为环境的因素,在返回时会返回正确的数据,也就是在读取的时候数据,可以读的对,但是在调用这个数据进行修改时就会出大问题。
问题2:即使将P改为数组也不行,原理同上。
问题3:Return keydata; 也不行,我之所以会拿出这个,是因为我本人在看公司代码的时候,遇到了有同事使用这种做法,但是没有出错,所以我也依葫芦画瓢,结果就是我错了。因为这里keydata在定义申明时时不想被改变的,这里再将它赋值会出大问题。
有问题就要找办法解决,接下来分析一下解决办法。
数值的返回有3中:
1、静态变量;
2、参数返回
3、全局变量
这里我主要介绍后面两种方法(主要是因为我现在没用过第一种),具体如下:
方法一:参数返回
void Encode(unsigned char ramdata, unsigned char const *keydata,unsigned char *p)
{
unsigned char ramkey[6];
unsigned char i;
………………
}
这里面的8P为返回值。
方法二:全局变量
unsigned char outdata[6]
unsigned char Encode(unsigned char ramdata, unsigned char const *keydata)
{
unsigned char ramkey[6];
………………
Return outdata;
}
outdata[6]为全局变量
方法三:开辟空间
采用 new和delete
注:使用这种方法,在采用了new后,在不使用的时候必需要记得释放delete,不然会发生内存溢出memory leak
方法三:开辟空间
采用 malloc和free
注:使用这种方法,在采用了malloc后,在不使用的时候必需要记得释放free,不然会发生内存溢出memory leak
总之表面上来看,这个程序好像是函数返回值的问题,不过实际上是变量生命周期的问题。当Encode运行完的时候,变量的生命也走到了尽头,会被系统收回内存,所以现在返回的指针指向的是一个不可预知的知。