关于函数返回值

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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运行完的时候,变量的生命也走到了尽头,会被系统收回内存,所以现在返回的指针指向的是一个不可预知的知。

相关文档
最新文档