在C中打印出字节的值及其地址

问题描述

我现在正在研究指针,并且试图了解事物在内存中的外观,因此尝试构建此程序。它的目标是获取一个整数,在内存中打印其地址,然后在每个字节上打印其整数值。因此对于整数4对(地址,值)。但是,由于得到这样的奇怪结果,我的工作结果相当混乱。如果有人可以解释我在做什么错,那将不胜感激。对于上下文,我从一个类中了解了一些有关计算机体系结构和内存的信息

输入一个整数:287

0x7ffd455a7474 31

0x7ffd455a7475 1

0x7ffd455a7476 0

0x7ffd455a7477 0

#include <stdio.h>

void byte_value(int *);
int main(){

    int n =1;
    printf("Enter an integer: ");

    if (scanf("%d",&n) == 1)

        byte_value(&n);

    

    return 0;  

}

void byte_value(int *p) {
    char *p2=((char *)p);
    char *max=p2+sizeof(int);
    for(;p2<max;p2++){
            printf("%p %u\n",p2,*p2);
    }

    return;

}

解决方法

我认为这个版本可能会解释更多。 (十六进制值非常方便)

void byte_value(void *,size_t);
int main(void)
{

    int n =1;
    printf("Enter an integer: ");

    if (scanf("%d",&n) == 1)
        printf("\n------------\nentered: %d (0x%x)\n",n,(unsigned)n);
        
        byte_value(&n,sizeof(n));
}

void byte_value(void *ptr,size_t size) 
{
    unsigned char *p = ptr;
    while(size--)
    {
        printf("%p - %03u (0x%02x)\n",(void *)p,*p,*p);
        p++;
    }
}