打印

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

[复制链接]
2602|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); 不就完了吗.

使用特权

评论回复
5
风溪香士|  楼主 | 2013-2-28 13:50 | 只看该作者
delin17 发表于 2013-2-23 11:36
如果函数返回的指针是指赂子函数里定义的变量的指针的话,返回后数据就会丢失。
如果函数返回的指针值指向 ...

如果我定义了一个全局变量,在子函数中定义一个指针,把这个全局变量的地址赋值给指针,那么退出子函数后,这个地址中的数据就还在。如果我在子函数中定义一个指针,再定义一个变量,把变量的地址赋值给指针,那么退出子函数后,这个地址中的数据就不存在了,就算返回得到了指针的值也没有意义了。是这个意思吗?
如果我在子函数中定义一个指针,然后随便给他赋个值,这个值就是一个地址,我把数据放到这个地址中,这个地址算是局部变量吗?当退出函数时,这个地址中的数据会被清除吗?

使用特权

评论回复
6
风溪香士|  楼主 | 2013-2-28 13:53 | 只看该作者
hgjinwei 发表于 2013-2-23 13:13
把函数写成:int xxx_read(int buff_size,unsigned char *buff); 不就完了吗.

我现在就是这样写的,把一个数组名作为函数的参数,把得到的数据放到这个数组中。但我想知道函数返回指针是怎么回事。

使用特权

评论回复
7
delin17| | 2013-3-4 11:01 | 只看该作者
风溪香士 发表于 2013-2-28 13:50
如果我定义了一个全局变量,在子函数中定义一个指针,把这个全局变量的地址赋值给指针,那么退出子函数后 ...

是不能随便赋值的,如果这样做就是不可预知的情况,因为你给的地址值,你不知道是否还有其它地方用到。如果没有地方用到,就会保留,如果有地方用到,就会被冲掉,或影响到程序的正常运行。
指针是要禁止指到非法的地方。 非法就是不能任意指,必须是你清楚他指那里

使用特权

评论回复
8
delin17| | 2013-3-4 11:02 | 只看该作者
风溪香士 发表于 2013-2-28 13:53
我现在就是这样写的,把一个数组名作为函数的参数,把得到的数据放到这个数组中。但我想知道函数返回指针 ...

函数返回指就是返回指针,重点是你指针指向的变量的作用域决定了,你指针指向的数据区是否有效。

使用特权

评论回复
9
ayb_ice| | 2013-3-4 11:34 | 只看该作者
把指针作为参数即可

使用特权

评论回复
10
liang7143| | 2013-3-4 15:05 | 只看该作者
我想问一下,从子函数中返回后,子函数中的变量会清除,但我在主函数中调用该子函数时,用一个指针变量将子函数返回的指针保存起来不就行了吗,比如写作char *temp=function();。就像调用一般的带返回值的函数一样。


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

解决办法是可以使用全局变量,或者是静态变量,类似于
char * function(void)
{
static char a[] = "hello";
……
return a;
}

使用特权

评论回复
11
风溪香士|  楼主 | 2013-4-19 19:33 | 只看该作者
liang7143 发表于 2013-3-4 15:05
指针确实还在,但是指针指向的内容已经不在了,这是典型的野指针这里执行*temp=function();temp虽然获取 ...

我还是有点不明白,我是在子函数中从单片机的IO口中获得数据,用一个变量temp保存。然后定义一个指针p,然后*p=temp,这样就是把temp的值放在指针p指向的地址,然后返回p。这样退出这个子函数后,什么的值还在,什么的值没了?

使用特权

评论回复
12
ayb_ice| | 2013-4-20 09:01 | 只看该作者
关键是指针指向的空间是否在函数返回时已经被释放了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

13

主题

82

帖子

1

粉丝