岁寒青松 发表于 2022-2-15 16:47:07

内存打印问题

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, p, p, p);
13         printf("0x12345678 在内存中依次存放为:0x%2x 0x%2x 0x%2x 0x%2x\n", *(p++), *(p++), *(p++), *(p++));
14
15         return 0;
16 }
运行结果如图:

为什么会出现相反的打印结果呢?求大神指教!

阿萨德按时 发表于 2022-2-15 17:01:13

具体我也不懂 可以看看这个https://fishc.com.cn/forum.php?mod=viewthread&tid=75394&extra=page%3D1%26filter%3Dtypeid%26typeid%3D571

人造人 发表于 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, p, p, p);

      //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-2-16 10:31:14

人造人 发表于 2022-2-15 18:27
不能这样连着写

原来 printf 里面是从右往左计算的,感谢!!!

jhq999 发表于 2022-2-16 10:33:36

函数运行取参数是从右到左

人造人 发表于 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
$

人造人 发表于 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'
页: [1]
查看完整版本: 内存打印问题