搜索
bottom↓
回复: 15

关于结构体指针的问题求教

[复制链接]

出5入0汤圆

发表于 2021-1-22 22:06:50 | 显示全部楼层 |阅读模式
  1. typedef struct {
  2. int age;
  3. int num;
  4. }student;
  5. student s[3] = { {1,2},{3,4},{5,6} };
  6. student *p1 = &s;

  7. printf("size of s = %d ,s[0]= %d \n", sizeof(s), (sizeof(s)/sizeof(s[0])));
  8. printf("size of *p1 = %d ,size of p1 = %d \n", sizeof(*p1), sizeof(p1));
  9. printf("size of student = %d \n", sizeof(student));

  10. printf(" %d \n", *(s + 1));
  11. student a = *(p1 + 1);
  12. printf(" %d \n",a);
  13. printf(" %d \n", a.age);
  14. printf(" %d, %d \n",*s ,a.age);

复制代码


以下是在VS2019是编译输出的结果
size of s = 24 ,s[0]= 3
size of *p1 = 8 ,size of p1 = 4
size of student = 8
3
3
3
1, 2

我的问题是a.age是3啊为啥打印2??????????

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出200入2554汤圆

发表于 2021-1-23 00:07:45 | 显示全部楼层
你把结构体压进了 printf 的堆栈里,然后怪 %d 不给你显示?

我用 VS2005 调试给你看,以下截图是最后一行 printf 执行时,跟踪进 printf 的结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出5入0汤圆

 楼主| 发表于 2021-1-23 07:24:18 来自手机 | 显示全部楼层
t3486784401 发表于 2021-1-23 00:07
你把结构体压进了 printf 的堆栈里,然后怪 %d 不给你显示?

我用 VS2005 调试给你看,以下截图是最后一行 ...

大师受小弟一拜。

出0入8汤圆

发表于 2021-1-23 08:14:30 | 显示全部楼层
很多高手都说过    多调试才能进步,今天算见识到了,厉害

出16170入6148汤圆

发表于 2021-1-23 09:08:55 来自手机 | 显示全部楼层
“关于结构体指针的问题求教”标题不合格。请自行修改。

帖子标题必须能充分说明帖子的内容。如你要问AVR的ADC如何才能测量得比较准确,“AVR的ADC如何消除干扰测量得比较准确?”是合格的标题。不合格举例:
    1:小女子冰天雪地裸体跪求解决方法
    2:救命啊...
    3:高手请出招,一个无法解决的AVR问题
    4:一个困扰学习单片机初学者,惊动单片机开发者的难题
    5:AVR的ADC测量   (点评:你到底是问问题,或是有技术心得与大家分享?)

出0入0汤圆

发表于 2021-1-23 09:31:24 | 显示全部楼层
t3486784401 发表于 2021-1-23 00:07
你把结构体压进了 printf 的堆栈里,然后怪 %d 不给你显示?

我用 VS2005 调试给你看,以下截图是最后一行 ...

高手历害

出0入4汤圆

发表于 2021-1-23 09:35:51 | 显示全部楼层
我在DEV-C++ 实际测试是3

size of int = 4 ,

size of s = 24 ,number of s = 3
size of *p1 = 8 ,size of p1 = 8
size of student = 8
*(s+1)= 3
a = 3
a.age =  3
*s=  1  , a.age = 3

出5入0汤圆

 楼主| 发表于 2021-1-23 12:05:48 来自手机 | 显示全部楼层
armok. 发表于 2021-1-23 09:08
“关于结构体指针的问题求教”标题不合格。请自行修改。

帖子标题必须能充分说明帖子的内容。如你要问AVR ...

老大,本人初学对编程刚入门。问题不知道该怎么描述。手机端不知道怎么更该?

出200入2554汤圆

发表于 2021-1-23 12:20:08 | 显示全部楼层
laujc 发表于 2021-1-23 09:35
我在DEV-C++ 实际测试是3

size of int = 4 ,


仔细看,你的 sizeof p1 = 8

代表着你这个 DEV C++ 运行的都是 64bit 指针,这个和我以及 LZ 使用的 VS 系列 32bit 指针有区别。

32bit-printf:
  1. printf(" %d, %d \n", *s      , a.age);
  2. //Addr:00H           04H 08H   0CH
  3. //Parm:              %d  %d
复制代码


64bit-printf:
  1. printf(" %d, %d \n", *s      , a.age);
  2. //Addr:00H           08H 0CH   10H
  3. //Parm:              %d        %d
复制代码


printf 的堆栈规则是:以首个参数宽度为标准,后续参数依次偏移同样宽度。
对于 32bit 就是依次偏移 4 字节,于是加载到了 *s 里边的数据;
对于 64bit 就是依次偏移 8 字节,于是仅仅加载了 *s 前四个字节,下一个就加载到了 a.age.

一切祸根皆源于 %d 和 *s 不匹配,而且还是向堆栈里压这种长度说不准的结构体

出5入0汤圆

 楼主| 发表于 2021-1-23 12:22:29 来自手机 | 显示全部楼层
t3486784401 发表于 2021-1-23 12:20
仔细看,你的 sizeof p1 = 8

代表着你这个 DEV C++ 运行的都是 64bit 指针,这个和我以及 LZ 使用的 VS  ...

https://mp.weixin.qq.com/s/Ap26EOp40TfFV4Ots8Nkvg

出5入0汤圆

 楼主| 发表于 2021-1-23 12:23:34 来自手机 | 显示全部楼层
laujc 发表于 2021-1-23 09:35
我在DEV-C++ 实际测试是3

size of int = 4 ,

https://mp.weixin.qq.com/s/Ap26EOp40TfFV4Ots8Nkvg

出0入4汤圆

发表于 2021-1-23 12:50:59 | 显示全部楼层
t3486784401 发表于 2021-1-23 12:20
仔细看,你的 sizeof p1 = 8

代表着你这个 DEV C++ 运行的都是 64bit 指针,这个和我以及 LZ 使用的 VS  ...

请接下我的膝盖。。。

我一直在写下位机,没有考虑这么深

出0入0汤圆

发表于 2021-1-23 13:32:48 来自手机 | 显示全部楼层
哇,写这么复杂,看得我头晕

出0入14汤圆

发表于 2021-1-23 15:03:47 | 显示全部楼层
我在想这样乱用指针好吗,各种编译器的不同会引起各种不兼容问题。

出0入16汤圆

发表于 2021-1-25 15:24:11 | 显示全部楼层
printf 结构体也是人才。。。

出5入0汤圆

 楼主| 发表于 2021-1-25 18:45:38 | 显示全部楼层
初音之恋 发表于 2021-1-25 15:24
printf 结构体也是人才。。。

小白啊              
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 02:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表