用C语言打印出一个字节的值及其地址
我现在正在研究指针,我试图了解内存中的东西是如何显示的,所以我正在尝试构建这个程序。它的目标是获取一个整数,在内存中打印它的地址,然后在每个字节打印它的整数值。所以对于一个整数,4对(地址,值)。然而,我的工作结果相当混乱,因为我得到了像这样奇怪的结果。如果有人能解释我做错了什么,我将不胜感激。从上下文来看,我从一门课上了解了一点关于计算机体系结构和内存的知识 输入一个整数:287 0x7ffd455a7474 31 0x7ffd455a7475 1 0x7ffd455a7476 0 0x7ffd455a7477 0用C语言打印出一个字节的值及其地址,c,pointers,C,Pointers,我现在正在研究指针,我试图了解内存中的东西是如何显示的,所以我正在尝试构建这个程序。它的目标是获取一个整数,在内存中打印它的地址,然后在每个字节打印它的整数值。所以对于一个整数,4对(地址,值)。然而,我的工作结果相当混乱,因为我得到了像这样奇怪的结果。如果有人能解释我做错了什么,我将不胜感激。从上下文来看,我从一门课上了解了一点关于计算机体系结构和内存的知识 输入一个整数:287 0x7ffd455a7474 31 0x7ffd455a7475 1 0x7ffd455a7476 0 0x7ff
#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;
}
#包括
无效字节_值(int*);
int main(){
int n=1;
printf(“输入一个整数:”);
如果(扫描频率(“%d”,&n)==1)
字节值(&n);
返回0;
}
无效字节_值(int*p){
char*p2=((char*)p);
char*max=p2+sizeof(int);
对于(;p2我认为这个版本可能会解释得更多一些。(十六进制值非常方便)
287=256*1+31。输出没有问题。也许您想知道更多关于大于一个字节的值是如何存储在内存中的。我看不出这个程序有什么特别奇怪或错误的地方,除了可能将%u
与纯字符一起使用。您希望得到什么输出?除了不强制转换p2
参数到printf
作为(void*)p2
(这只是一个“小”错误,不会影响99%的情况),您没有做错任何事。您不明白的是什么?@AdrianMole这甚至不是一个错误,因为char*
和void*
保证具有相同的表示形式。我本来希望打印二进制表示形式。不鼓励回答代码,至少您应该解释代码的作用@M.M.在哪里----
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++;
}
}