我想打印出来自给定内存地址的内容。
使用这段代码,我可以定义一个变量,定义一个指向它的指针并使用指针打印它的内容。
char buf[100];
void *p = buf;
strcpy(p, "Test string");
printf("Address: %X\n", &buf);
printf("Contents: %c\n", p);
我想要做的是指定一个特定的内存地址,并打印出该块的内容。我尝试通过递增和递减p进行实验,但它不打印任何东西。
答案 0 :(得分:4)
一个有趣的小问题。每个程序员迟早都应该出现这种情况,无论是出于好奇还是出于好意。
基本上是四个部分。
为简单起见,我将使用地址0x1000和整数内容。
int address = 0x1000;
int* pcontent = (int*)address;
int content = *pcontent;
printf ("Address %p: content %08x\n", pcontent, content);
应该提出两点。
[许多年前,我使用这种策略在只有96KB内存的机器上打印出内存的全部内容,这导致了一些有趣的黑客攻击可能性。但我离题了。]
答案 1 :(得分:3)
您使用了错误的说明符来打印地址。使用%p
并将参数投射到void *
。
printf("Address: %p\n", (void*)buf);
并打印字符串
printf("Contents: %s\n", p);
答案 2 :(得分:1)
您必须将指针p定义为
char *p = buf;
或使用铸造然后递增p。例如
p = ( char *)p + n;
例如
printf( "%s\n", ( char *)p + 5 );
您可能不会递增/递减void *
类型的指针,因为void
的类型不完整。
这些调用中的格式说明符
printf("Address: %X\n", &buf);
printf("Contents: %c\n", p);
错了。
如果要打印出字符串,则必须指定%s
。如果你想只打印一个字符,那么你应该写
char *p = buf;
printf("Contents: %c\n", p[0]);
或
void *p = buf;
printf("Contents: %c\n", ( ( char *)p )[0]);
答案 3 :(得分:0)
您正在使用%c 而是使用%s 打印字符串printf("Contents: %s\n", p);
答案 4 :(得分:0)
如果我们想从内存中打印随机字节,我们希望使用:
char *p = buf;
printf("Address: %p\n", p);
printf("Contents: 0x%02x\n", *p);
但是请注意,给定一个随机地址,解除引用会导致应用程序失败。您不能假设所有内存空间都有效。
答案 5 :(得分:0)
您可以尝试这样的事情:
void printMemory(void* mem, int bytes){
char* p = (char*) mem;
for(int i=0;i<bytes;i++){
printf("%x ",p[i] & 0xff);
if(i%8 == 7)
printf("\n");
}
}
这将每行打印8个字节。