关于返回指针的函数的问题

[复制链接]
3187|11
 楼主| 风溪香士 发表于 2013-2-23 11:31 | 显示全部楼层 |阅读模式
我的单片机从一个无线模块中读取多字节的数据,我的想法就是在函数中定义一个指针,然后把数据从指针指向的地址依次放下去,最后把指针返回。
网上说不能简单地将指针返回,这样返回的指针会丢失,是无效的指针。
我想问一下,从子函数中返回后,子函数中的变量会清除,但我在主函数中调用该子函数时,用一个指针变量将子函数返回的指针保存起来不就行了吗,比如写作char *temp=function();。就像调用一般的带返回值的函数一样。
请前辈们指点一下。
delin17 发表于 2013-2-23 11:36 | 显示全部楼层
如果函数返回的指针是指赂子函数里定义的变量的指针的话,返回后数据就会丢失。
如果函数返回的指针值指向的是全局变量,返回后数据是正常的。

另外,定义一个指针,是不能马上直接往指针里写数据的。必须给指针赋值后,才能进行赋值。
dirtwillfly 发表于 2013-2-23 11:51 | 显示全部楼层
楼上正解,还是全局变量和局部变量的问题
hgjinwei 发表于 2013-2-23 13:13 | 显示全部楼层
把函数写成:int xxx_read(int buff_size,unsigned char *buff); 不就完了吗.
 楼主| 风溪香士 发表于 2013-2-28 13:50 | 显示全部楼层
delin17 发表于 2013-2-23 11:36
如果函数返回的指针是指赂子函数里定义的变量的指针的话,返回后数据就会丢失。
如果函数返回的指针值指向 ...

如果我定义了一个全局变量,在子函数中定义一个指针,把这个全局变量的地址赋值给指针,那么退出子函数后,这个地址中的数据就还在。如果我在子函数中定义一个指针,再定义一个变量,把变量的地址赋值给指针,那么退出子函数后,这个地址中的数据就不存在了,就算返回得到了指针的值也没有意义了。是这个意思吗?
如果我在子函数中定义一个指针,然后随便给他赋个值,这个值就是一个地址,我把数据放到这个地址中,这个地址算是局部变量吗?当退出函数时,这个地址中的数据会被清除吗?
 楼主| 风溪香士 发表于 2013-2-28 13:53 | 显示全部楼层
hgjinwei 发表于 2013-2-23 13:13
把函数写成:int xxx_read(int buff_size,unsigned char *buff); 不就完了吗.

我现在就是这样写的,把一个数组名作为函数的参数,把得到的数据放到这个数组中。但我想知道函数返回指针是怎么回事。
delin17 发表于 2013-3-4 11:01 | 显示全部楼层
风溪香士 发表于 2013-2-28 13:50
如果我定义了一个全局变量,在子函数中定义一个指针,把这个全局变量的地址赋值给指针,那么退出子函数后 ...

是不能随便赋值的,如果这样做就是不可预知的情况,因为你给的地址值,你不知道是否还有其它地方用到。如果没有地方用到,就会保留,如果有地方用到,就会被冲掉,或影响到程序的正常运行。
指针是要禁止指到非法的地方。 非法就是不能任意指,必须是你清楚他指那里
delin17 发表于 2013-3-4 11:02 | 显示全部楼层
风溪香士 发表于 2013-2-28 13:53
我现在就是这样写的,把一个数组名作为函数的参数,把得到的数据放到这个数组中。但我想知道函数返回指针 ...

函数返回指就是返回指针,重点是你指针指向的变量的作用域决定了,你指针指向的数据区是否有效。
ayb_ice 发表于 2013-3-4 11:34 | 显示全部楼层
把指针作为参数即可
liang7143 发表于 2013-3-4 15:05 | 显示全部楼层
我想问一下,从子函数中返回后,子函数中的变量会清除,但我在主函数中调用该子函数时,用一个指针变量将子函数返回的指针保存起来不就行了吗,比如写作char *temp=function();。就像调用一般的带返回值的函数一样。


指针确实还在,但是指针指向的内容已经不在了,这是典型的野指针
  1. char * function(void)
  2. {
  3. char a[] = "hello";
  4. ……
  5. return a;
  6. }
这里执行*temp=function();temp虽然获取了a的地址,但是a的里面的内容"hello",已经被系统收回。然后执行*temp = ‘a';这样的操作势必会造成内存的意外修改。

解决办法是可以使用全局变量,或者是静态变量,类似于
  1. char * function(void)
  2. {
  3. static char a[] = "hello";
  4. ……
  5. return a;
  6. }
 楼主| 风溪香士 发表于 2013-4-19 19:33 | 显示全部楼层
liang7143 发表于 2013-3-4 15:05
指针确实还在,但是指针指向的内容已经不在了,这是典型的野指针这里执行*temp=function();temp虽然获取 ...

我还是有点不明白,我是在子函数中从单片机的IO口中获得数据,用一个变量temp保存。然后定义一个指针p,然后*p=temp,这样就是把temp的值放在指针p指向的地址,然后返回p。这样退出这个子函数后,什么的值还在,什么的值没了?
ayb_ice 发表于 2013-4-20 09:01 | 显示全部楼层
关键是指针指向的空间是否在函数返回时已经被释放了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我命由我不由天!

13

主题

82

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部