吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 894|回复: 14
收起左侧

[已解决] 打印指针的字节表示出错

  [复制链接]
mxwawaawxm 发表于 2022-10-8 21:47
本帖最后由 mxwawaawxm 于 2022-10-12 09:31 编辑

[C] 纯文本查看 复制代码
/*
打印不同程序对象的字节表示
小端法、大端法

强制类型转换
指针
*/

#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");
}

如上面代码所示,主要功能是为了依字节打印对象。
这是从《深入理解计算机系统》看到的代码。我改动了一点。
最后输出结果是
[Asm] 纯文本查看 复制代码
&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
一剑飘零 发表于 2022-10-8 22:15

哦。不好意思。
如果不对,我也没看 出来。我也是新手。
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
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-17 09:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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