mxwawaawxm 发表于 2022-10-8 21:47

打印指针的字节表示出错

本帖最后由 mxwawaawxm 于 2022-10-12 09:31 编辑

/*
打印不同程序对象的字节表示
小端法、大端法

强制类型转换
指针
*/

#include <stdio.h>
#include <string.h>

void show_bytes(unsigned char * start, size_t len);

int main(int argc, const char *argv[])
{
    int ival = 12345;
    int *pival = &ival;

    printf("&pival = %p\n", &pival);
    show_bytes((unsigned char *)&pival, sizeof(void *));

    return 0;
}

void show_bytes(unsigned char * start, size_t len)
{
    size_t i;

    for (i=0;i<len;i++) {
      // 用至少两个数字的十六进制格式输出
      printf("%.2x ", *(start+i));
    }

    printf("\n");
}
如上面代码所示,主要功能是为了依字节打印对象。
这是从《深入理解计算机系统》看到的代码。我改动了一点。
最后输出结果是
&pival = 000000000024FE40
4c fe 24 00 00 00 00 00
这应该是采用小端法。但为什么,指针最后是40,而打印出来是4c
请问,哪里出错了。

一剑飘零 发表于 2022-10-8 22:11

    printf("&pival = %p\n", pival);
19行把&把去,本身就是地址了,不必加&。

zhangzhequan 发表于 2022-10-8 22:12

&pival 是栈上地址

一剑飘零 发表于 2022-10-8 22:15

zhangzhequan 发表于 2022-10-8 22:12
&pival 是栈上地址

哦。不好意思。
如果不对,我也没看 出来。我也是新手。

unmask 发表于 2022-10-8 22:17

Line19:printf("&pival = %p\n", pival);
你再试试

一剑飘零 发表于 2022-10-8 22:21

unmask 发表于 2022-10-8 22:17
Line19:printf("&pival = %p\n", pival);
你再试试

你和我说的一样,他说的大端小端我还没接触过。这个小问题他应该不会犯。
这就是我的知识盲区了。

unmask 发表于 2022-10-8 22:29

大端小端就是一种内存存放数据的模式,目前题主的问题是想用一个指针数据来证明大端和小端,结果打印指针时,用了指针数据的栈地址也就是&pival,实际上pival本身就是一个指针数据,指向一个int数据的地址。

zhangting2022 发表于 2022-10-9 06:38

高端局,厉害

wfy316 发表于 2022-10-9 07:54

谢谢分享!

xiadongming 发表于 2022-10-9 08:16

页: [1] 2
查看完整版本: 打印指针的字节表示出错