免费注册 查看新帖 |

Chinaunix

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

64位Linux shmat返回值被截断 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-28 21:05 |只看该作者 |倒序浏览
共享内存的基本用法:
shmget
shmat
调用都没有问题

对shmat做了封装,示意代码如下

char* LinkShm(int shm_id, int flag)
{
  char *shmptr;
  shmptr = shmat(shm_id,NULL,flag);
  return shm_ptr;
}

然后调用返回的值,一直是错误的,调用代码如下:

char* shmptr;
shmptr = LinkShm(shm_id,0);

使用gdb调试发现,函数LinkShm()中的shmptr的值是对的,返回给调用者指针shmptr时shmat返回的64位地址,高位4字节给截断了,并且补上了0xffffffff,后面4个字节是正确地址的低位4字节。

直接调用shmat,即:

char* shmptr;
shmptr = shmat(shm_id,NULL,0);

依然是同样的错误。

想不通是什么原因。指针转换我也试过,一样的错误。

补充:
编译的时候出现警告:将整数值赋值给指针未做正确转换。(大致是这样,凭记忆)

论坛徽章:
0
2 [报告]
发表于 2012-06-28 23:34 |只看该作者
将整数值赋值给指针未做正确转换
那你看看这个警告产生的原因呀,,照你的说法,估计是和这个警告有关了。

论坛徽章:
0
3 [报告]
发表于 2012-06-28 23:38 |只看该作者
为什么你要用大致是这样呢?  难道你不掌握代码?

64位下int , unsigned int 都是4字节
指针和long类型都是8字节。
如果你这之间发生了int和指针的转换的话,当然会出问题了。

可能是这个程序是从32位移植到64位的原因 ?  32位里面会用指针来传递int
如  int a = (int)ptr;  等情况 。

论坛徽章:
0
4 [报告]
发表于 2012-06-29 09:31 |只看该作者
已经解决了,在调用LinkShm()函数之前加上声明就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP