c - 特定地址的内存转储的最佳数据类型

标签 c pointers memory

我正在用 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/

相关文章:

iphone - 我的retainCount 增加了?

c - 我怎样才能阻止程序读取 'Enter' 作为输入?

c++ memset() 在主函数内/外的工作方式不同

c++ - 为什么 istream::operator>> 接受字符指针/数组?

c - 通过 C 中的函数传递指针变量

go - 有什么简单的方法可以找出一个结构的实例占用多少内存**包括**它指向的东西的大小?

c++ - 如何获取指向函数第一个参数的指针?

c - 最大堆栈大小、ulimit -s、段错误 11——这是如何工作的?

c - 如何通过一个定时器捕获输入信号并生成pwm信号

c - 用于对用户输入的数组从最低到最高进行排序的程序。 C语言编程