鱼C论坛

 找回密码
 立即注册
查看: 1059|回复: 6

[已解决]内存打印问题

[复制链接]
发表于 2022-2-15 16:47:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
  1.   1 #include <stdio.h>
  2.   2
  3.   3 int main()
  4.   4 {
  5.   5         int a = 0x12345678;
  6.   6         unsigned char *p = (unsigned char*)&a;
  7.   7         if (*p == 0x12)
  8.   8                 printf("您的机器采用大端字节序。\n");
  9.   9         else
  10. 10                 printf("您的机器采用小端字节序。\n");
  11. 11
  12. 12         printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", p[0], p[1], p[2], p[3]);
  13. 13         printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
  14. 14
  15. 15         return 0;
  16. 16 }
复制代码
运行结果如图:

为什么会出现相反的打印结果呢?求大神指教!
最佳答案
2022-2-15 18:27:09
不能这样连着写
  1. #include <stdio.h>

  2. int main()
  3. {
  4.          int a = 0x12345678;
  5.          unsigned char *p = (unsigned char*)&a;
  6.          if (*p == 0x12)
  7.                  printf("您的机器采用大端字节序。\n");
  8.          else
  9.                 printf("您的机器采用小端字节序。\n");

  10.         printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", p[0], p[1], p[2], p[3]);

  11.         //printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
  12.         printf("0x12345678 在内存中依次存放为:");
  13.         printf("0x%2x ", *p++);
  14.         printf("0x%2x ", *p++);
  15.         printf("0x%2x ", *p++);
  16.         printf("0x%2x ", *p++);
  17.         puts("");

  18.         return 0;
  19. }
复制代码
屏幕截图 2022-02-15 164532.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-2-15 17:01:13 | 显示全部楼层
具体我也不懂 可以看看这个https://fishc.com.cn/forum.php?m ... peid%26typeid%3D571
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-15 18:27:09 | 显示全部楼层    本楼为最佳答案   
不能这样连着写
  1. #include <stdio.h>

  2. int main()
  3. {
  4.          int a = 0x12345678;
  5.          unsigned char *p = (unsigned char*)&a;
  6.          if (*p == 0x12)
  7.                  printf("您的机器采用大端字节序。\n");
  8.          else
  9.                 printf("您的机器采用小端字节序。\n");

  10.         printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", p[0], p[1], p[2], p[3]);

  11.         //printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
  12.         printf("0x12345678 在内存中依次存放为:");
  13.         printf("0x%2x ", *p++);
  14.         printf("0x%2x ", *p++);
  15.         printf("0x%2x ", *p++);
  16.         printf("0x%2x ", *p++);
  17.         puts("");

  18.         return 0;
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-16 10:31:14 | 显示全部楼层

原来 printf 里面是从右往左计算的,感谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-16 10:33:36 | 显示全部楼层
函数运行取参数是从右到左
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-16 12:36:07 | 显示全部楼层
岁寒青松 发表于 2022-2-16 10:31
原来 printf 里面是从右往左计算的,感谢!!!

这个计算顺序是不确定的,是未定义的,不同的编译器很有可能会给出不同的结果
  1. $ gcc -g -Wall -o main main.c
  2. main.c: In function ‘main’:
  3. main.c:13:104: warning: operation on ‘p’ may be undefined [-Wsequence-point]
  4.    13 |          printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
  5.       |                                                                                                      ~~^~~
  6. main.c:13:104: warning: operation on ‘p’ may be undefined [-Wsequence-point]
  7. main.c:13:104: warning: operation on ‘p’ may be undefined [-Wsequence-point]
  8. $ ./main
  9. 您的机器采用小端字节序。
  10. 0x12345678 在内存中依次存放为:0x78 0x56 0x34 0x12
  11. 0x12345678 在内存中依次存放为:0x12 0x34 0x56 0x78
  12. $ clang -g -Wall -o main main.c
  13. main.c:13:90: warning: multiple unsequenced modifications to 'p' [-Wunsequenced]
  14.          printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
  15.                                                                                ^       ~~
  16. 1 warning generated.
  17. $ ./main
  18. 您的机器采用小端字节序。
  19. 0x12345678 在内存中依次存放为:0x78 0x56 0x34 0x12
  20. 0x12345678 在内存中依次存放为:0x78 0x56 0x34 0x12
  21. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-16 12:37:02 | 显示全部楼层
岁寒青松 发表于 2022-2-16 10:31
原来 printf 里面是从右往左计算的,感谢!!!

warning: operation on ‘p’ may be undefined
warning: multiple unsequenced modifications to 'p'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 00:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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