我正在用 C 语言编写一个 memdump 应用程序,目标是打印特定地址的应用程序内存的真实部分。我已有的代码是这样的:
void memdump(byte_t *ptr, long size ) {
...
typedef unsigned char byte_t;
byte_t data[size];
//&data[0] = &ptr;
byte_t * pointer_to_byte = data;
for (size_t j = 0; j < size; j+=10) {
printf("%p ",&data[j]);
for (size_t i = j; i < j+10; i++) {
printf("%02x ",*(pointer_to_byte+i));
}
for (size_t i = j; i < j+10; i++) {
if (isprint(*(pointer_to_byte+i))) {
printf("%c",*(pointer_to_byte+i));
} else {
printf("." );
}
}
printf("\n" );
}
}
main.c:
void *start_addr;
...
scanf("%p", &start_addr);
...
memdump( (byte_t*)start_addr, size );
你可以看到我使用数组来获取内存块,但这可能不是最好的方法。现在我想将地址作为要扫描的参数,我的问题是获取该地址的最佳数据类型是什么,以及如何更改我的代码以便我可以使用特定地址?我已经使用指针来打印数据和字符,因此指针是我认为最好的方式。
最佳答案
这个怎么样:
void memdump(byte_t *ptr, long size ) {
byte_t * baseptr; /* base addr for each row */
for (size_t j = 0; j < size; j+=10) { /* row loop */
baseptr = ptr+j;
printf("%p ",baseptr);
for (size_t i = j; i < j+10; i++) { /* hex code */
printf("%02x ",*(baseptr+i));
};
for (size_t i = j; i < j+10; i++) { /* char print */
if (isprint(*(baseptr+i))) {
printf("%c",*(baseptr+i));
} else {
printf(".");
};
};
printf("\n" );
};
};
关于c - 特定地址的内存转储的最佳数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49157560/