指针地址

bo_00 2010-10-04 07:08:17


int main(){

....
map_memroy_addr = mmap(NULL,36,PROT_READ|PROT_EXEC,MAP_SHARED,0);//返回内存映射区域的起始地址

printf("%p\n",map_memroy_addr);

printf("%p\n",map_memroy_addr+1);
printf("%p\n",(char *)map_memroy_addr+1);
....
}

//map_memroy_addr地址开始,存的是个字符串。


打印结果:
0x3026e000
0x3026e004
0x3026e001

问:
①打印map_memroy_addr+1 和 (char *)map_memroy_addr+1 有什么区别,为什么结果不一样??
②为什么打印map_memroy_addr+1的结果是0x3026e004,比打印map_memroy_addr的结果0x3026e000,加了0x04??
...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bo_00 2010-10-05
  • 打赏
  • 举报
回复
请参见 man page
http://linux.die.net/man/2/mmap

#include <sys/mman.h>
void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);
int munmap(void *start, size_t length);

mmap()的返回值指向的是void。



我好想知道我哪里错了。
map_memroy_addr的定义时,被定义成了32bit.
INT32 * map_memroy_addr;


我农民了,不过还是学习到了void*类的指针。
虽然书上没把void*类的指针讲的很详细。
不过通过实际的打印结果来看,在我使用的系统上,void*实际上返回的数据类型是32bit。

dingshaofengbinbin 2010-10-04
  • 打赏
  • 举报
回复
指针也是有类型的,int型指针加1肯定加4,因为int是4字节的。
  • 打赏
  • 举报
回复
请问LZ你的map_memroy_addr 是什么类型的哦??

map_memroy_addr + 1 == map_memroy_addr + sizeof(map_memroy_addr的类型)

。。。。。。。。
小魔菇 2010-10-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bo_00 的回复:]

补充问

如果把代码改成
map_memroy_addr = (char *)mmap(NULL,36,PROT_READ|PROT_EXEC,MAP_SHARED,0);

(char *)map_memroy_addr = mmap(NULL,36,PROT_READ|PROT_EXEC,MAP_SHARED,0);

打印结果还是:
0x3026e000
0x3026e……
[/Quote]

这个要看map_memroy_addr 本身是什么类型的
上面说的 应该可以解释
LZ对指针的理解不够深刻
bo_00 2010-10-04
  • 打赏
  • 举报
回复
补充问

如果把代码改成
map_memroy_addr = (char *)mmap(NULL,36,PROT_READ|PROT_EXEC,MAP_SHARED,0);

(char *)map_memroy_addr = mmap(NULL,36,PROT_READ|PROT_EXEC,MAP_SHARED,0);

打印结果还是:
0x3026e000
0x3026e004
0x3026e001

为什么呢?
千杯不醉-sen 2010-10-04
  • 打赏
  • 举报
回复
void*类的指针 加减单位是4(应该包括char*吧)
小魔菇 2010-10-04
  • 打赏
  • 举报
回复
指针的加减单位是它所指向的类型的长度的
如果是char*类型的指针 加减单位是1
void*类的指针 加减单位是4

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧