打印指针的字节表示出错
本帖最后由 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
请问,哪里出错了。
printf("&pival = %p\n", pival);
19行把&把去,本身就是地址了,不必加&。 &pival 是栈上地址 zhangzhequan 发表于 2022-10-8 22:12
&pival 是栈上地址
哦。不好意思。
如果不对,我也没看 出来。我也是新手。 Line19:printf("&pival = %p\n", pival);
你再试试 unmask 发表于 2022-10-8 22:17
Line19:printf("&pival = %p\n", pival);
你再试试
你和我说的一样,他说的大端小端我还没接触过。这个小问题他应该不会犯。
这就是我的知识盲区了。 大端小端就是一种内存存放数据的模式,目前题主的问题是想用一个指针数据来证明大端和小端,结果打印指针时,用了指针数据的栈地址也就是&pival,实际上pival本身就是一个指针数据,指向一个int数据的地址。 高端局,厉害 谢谢分享!
页:
[1]
2