结构体

不懂啊不懂 2017-08-15 09:25:46

struct MyStruct
{
int level;
int age;
};

void main()
{
MyStruct mystruct;
MyStruct* p = &mystruct;
mystruct.age = 10;
mystruct.level = 20;
printf("结构体大小:%d\n", sizeof(MyStruct));
printf("首地址:%x\n",p);
printf("age地址:%x\n", &(mystruct.age));
printf("age的值:%d\n", *(&(mystruct.age)));

printf("p指针:%xp+1指针: %x\n", p, p + 1);
printf("值:%d %d\n", *p, *(p + 1));
getchar();
}

结果如下:
结构体大小:8
首地址:12ffdac
age地址:12ffdb0
age的值:10

p指针:12ffdac p+1指针:12ffdb4
值:20 10

此时,p+1地址和age的地址并不一样,为什么结果是一样的?
...全文
283 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangjieqiFIsh 2017-08-16
  • 打赏
  • 举报
回复

//偏移一个MyStruct地址.
p + sizeof(struct MyStruct );
Acuity. 2017-08-16
  • 打赏
  • 举报
回复
MyStruct mystruct; MyStruct* p = &mystruct; 把这两句的指针p改成这样定义就能实现你想要的(p+1指向age): int* p = (int*)&mystruct;
自信男孩 2017-08-16
  • 打赏
  • 举报
回复
p+1的地址是结构体向后偏移sizeof(结构体)长度,即8个字节。计算一下你输出的地址,是不是p+1的地址减去p的地址是不是8个字节。 p+1是偏移之后的内存空间,是未定义的,输出的内容也是未定义的(不确定的),可以归结为越界操作。
xian_wwq 2017-08-16
  • 打赏
  • 举报
回复
p+1的操作后,指针指向的区域是未知的
赵4老师 2017-08-16
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
不懂啊不懂 2017-08-16
  • 打赏
  • 举报
回复
引用 6 楼 hou09tian 的回复:
[quote=引用 5 楼 LD_______ 的回复:] [quote=引用 3 楼 hou09tian 的回复:] 如果把代码改成 printf("值:%d %d\n", *p, *p); 打印出来的还是10和20。 可以考虑改成 printf("值:%d %d\n", p->age, ((p+1)->age));
(p+1)->age肯定越界啊,不过还是试了下,打印的值一长串子,不认识[/quote] 对啊,p+1本来就越界了嘛,p+1的地址是12ffdb4了嘛[/quote] 我想知道12ffdb4和12ffdb0的值为什么是一样的,有什么玄妙吗
棉猴 2017-08-16
  • 打赏
  • 举报
回复
C++数组地址偏移 http://blog.csdn.net/hou09tian/article/details/75332577 希望对你有帮助
棉猴 2017-08-15
  • 打赏
  • 举报
回复
引用 5 楼 LD_______ 的回复:
[quote=引用 3 楼 hou09tian 的回复:] 如果把代码改成 printf("值:%d %d\n", *p, *p); 打印出来的还是10和20。 可以考虑改成 printf("值:%d %d\n", p->age, ((p+1)->age));
(p+1)->age肯定越界啊,不过还是试了下,打印的值一长串子,不认识[/quote] 对啊,p+1本来就越界了嘛,p+1的地址是12ffdb4了嘛
不懂啊不懂 2017-08-15
  • 打赏
  • 举报
回复
引用 3 楼 hou09tian 的回复:
如果把代码改成 printf("值:%d %d\n", *p, *p); 打印出来的还是10和20。 可以考虑改成 printf("值:%d %d\n", p->age, ((p+1)->age));
(p+1)->age肯定越界啊,不过还是试了下,打印的值一长串子,不认识
棉猴 2017-08-15
  • 打赏
  • 举报
回复
把 printf("值:%d %d\n", *p, *(p + 1)); 分成两个printf printf("值:%d\n", (*p)); printf("值:%d\n", *(p+1));
棉猴 2017-08-15
  • 打赏
  • 举报
回复
如果把代码改成 printf("值:%d %d\n", *p, *p); 打印出来的还是10和20。 可以考虑改成 printf("值:%d %d\n", p->age, ((p+1)->age));
不懂啊不懂 2017-08-15
  • 打赏
  • 举报
回复
引用 1 楼 hdt 的回复:
加一指的是 p+sizeof(你的结构体);
是的,p+结构体大小后指针指向的是结构体的末尾,为什么打印出来的值是结构体里的值。 age的地址和p+1的地址打印的不一样,但是得出的值确实一样的
真相重于对错 2017-08-15
  • 打赏
  • 举报
回复
加一指的是 p+sizeof(你的结构体);

69,371

社区成员

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

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