鱼C论坛

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

[已解决]内存打印问题

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

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

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

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

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

 int main()
 {
         int a = 0x12345678;
         unsigned char *p = (unsigned char*)&a;
         if (*p == 0x12)
                 printf("您的机器采用大端字节序。\n");
         else
                printf("您的机器采用小端字节序。\n");

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

        //printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
        printf("0x12345678 在内存中依次存放为:");
        printf("0x%2x ", *p++);
        printf("0x%2x ", *p++);
        printf("0x%2x ", *p++);
        printf("0x%2x ", *p++);
        puts("");

        return 0;
}
屏幕截图 2022-02-15 164532.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

 int main()
 {
         int a = 0x12345678;
         unsigned char *p = (unsigned char*)&a;
         if (*p == 0x12)
                 printf("您的机器采用大端字节序。\n");
         else
                printf("您的机器采用小端字节序。\n");

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

        //printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
        printf("0x12345678 在内存中依次存放为:");
        printf("0x%2x ", *p++);
        printf("0x%2x ", *p++);
        printf("0x%2x ", *p++);
        printf("0x%2x ", *p++);
        puts("");

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

原来 printf 里面是从右往左计算的,感谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-16 10:33:36 | 显示全部楼层
函数运行取参数是从右到左
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个计算顺序是不确定的,是未定义的,不同的编译器很有可能会给出不同的结果
$ gcc -g -Wall -o main main.c
main.c: In function ‘main’:
main.c:13:104: warning: operation on ‘p’ may be undefined [-Wsequence-point]
   13 |          printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
      |                                                                                                      ~~^~~
main.c:13:104: warning: operation on ‘p’ may be undefined [-Wsequence-point]
main.c:13:104: warning: operation on ‘p’ may be undefined [-Wsequence-point]
$ ./main
您的机器采用小端字节序。
0x12345678 在内存中依次存放为:0x78 0x56 0x34 0x12
0x12345678 在内存中依次存放为:0x12 0x34 0x56 0x78
$ clang -g -Wall -o main main.c
main.c:13:90: warning: multiple unsequenced modifications to 'p' [-Wunsequenced]
         printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
                                                                               ^       ~~
1 warning generated.
$ ./main
您的机器采用小端字节序。
0x12345678 在内存中依次存放为:0x78 0x56 0x34 0x12
0x12345678 在内存中依次存放为:0x78 0x56 0x34 0x12
$
想知道小甲鱼最近在做啥?请访问 -> 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 12:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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