免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3597 | 回复: 8
打印 上一主题 下一主题

函数返回一个指针后,其调用者接收到这个指针有变化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-16 15:09 |只看该作者 |倒序浏览
本帖最后由 aomw10 于 2011-06-16 15:44 编辑

请问大家有没有遇到过这种情况,为了说明问题我简要写出代码

file a.c
------------------------------
vnp *a
a = function(.....)


file b.c
-----------------------------
vnp *function(.....)


function中打印日志,发现返回的指针是
[0xffffff0084e75000]

而在其调用者a.c中打印a,发现接收到得指针是
[0xffffffff84e75000]

也就是说,84前面的两位由00变为了ff

都是用%p打印。
头一次遇到这种情况,百思不得其解,希望大家指教。非常感谢

另外说一句,function返回的地址是内核空间里面的,调用function的地方是在用户态,
不知道是否是因为这个原因发生了转换?

FreeBSD 7.0 64位多核上发生的问题

论坛徽章:
2
戌狗
日期:2013-11-06 17:35:36寅虎
日期:2014-10-20 23:12:29
2 [报告]
发表于 2011-06-16 15:14 |只看该作者
看你的function的实现啦, 如果是malloc new 之类的绝大部分是不一样的。 如果是返回一个全局变量的指针,就是另外一回事。

论坛徽章:
0
3 [报告]
发表于 2011-06-16 15:18 |只看该作者
看你的function的实现啦, 如果是malloc new 之类的绝大部分是不一样的。 如果是返回一个全局变量的指针,就 ...
peijue 发表于 2011-06-16 15:14



    是全局指针,function里面逻辑很简单,返回的肯定是那个指针没错,其调用者中也肯定接收的是这个指针。打印都没问题

而且指针只有中间两位由变化了,大家不觉得很奇怪吗

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2011-06-16 16:45 |只看该作者
进程发生切换了吗?
如果不是同一个进程上下文的话,线性地址发生变化是很平常的事。

论坛徽章:
0
5 [报告]
发表于 2011-06-16 18:37 |只看该作者
进程发生切换了吗?
如果不是同一个进程上下文的话,线性地址发生变化是很平常的事。
flw 发表于 2011-06-16 16:45



    进程没有切换,一直都是同一个进程的。

论坛徽章:
0
6 [报告]
发表于 2011-06-16 19:19 |只看该作者
应该是地址空间不一样的原因吧,目前的Linux好像只能占32位的地址空间,也就是0~4G的地址空间,0~3G是用户空间。下面那个用户态地址有8个数字,确实是32位地址,但是上面的那个内核地址似乎有某些向上兼容的意味,那个地址有10个数字,就是40位地址空间,即1024*1G=1T。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2011-06-16 20:41 |只看该作者
回复 1# aomw10

试试:
vnp *a
a = function(.....);
printf("%p", (void*) a);

对function内部的日志, 如果指针类型不是 void* 或者 char/signed char/unsigned char 的指针,
也添加一个转型试试?

如果日志是void*或者3种char指针, 直接输出:
void* function( ... )
{
    void* result;
    ...
    result = ...;
    log("%p", result);
    ...
    return result;
}

如果不是, 添加一个转型试试?
void* function( ... )
{
    X* result;
    ...
    result = ...;
    log("%p", (void*)result );
    return result;
}

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
8 [报告]
发表于 2011-06-17 08:49 |只看该作者
无责任猜想,会不会是%p需要8个字节,但是你传入的实际上不是一个8字节的pointer(比如中途被什么宏给搞成只有4个字节了),结果打印的时候有一部分就是栈上面的随机值啊?

论坛徽章:
0
9 [报告]
发表于 2011-06-17 13:32 |只看该作者
另外说一句,function返回的地址是内核空间里面的,调用function的地方是在用户态,
不知道是否是因为这个原因发生了转换?


如何返回内核空间的地址?
这个函数是系统调用么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP