如何循环和读取一系列内存地址中的内容

时间:2015-08-03 02:43:45

标签: c memory-address

我是C的新手,我想阅读内存地址范围内的内容

假设我有以下地址范围:0x00065580 - 0x000655c0

此范围来自命令:

 $ cat /proc/a_process_pid/maps | grep heap
 00065580-000655c0 ...........heap

(请参阅上面范围内的十六进制转储图像)

enter image description here

我尝试使用循环但没有运气,(就像想到Java开发一样)

#include <stdio.h>
#define START_ADDR 0x00065580 
#define END_ADDR 0x000655c0
int main(){
   char *start = START_ADDR ;
   char *end = END_ADDR;
   for( char *i=start ; i <= end ; i++ ){
        printf("%s",i);
   }
   return 0;
}

它会产生错误:

root@localhost:~# ./test
Segmentation fault (core dumped)

请告诉我我错了什么以及我需要了解什么?

2 个答案:

答案 0 :(得分:2)

现代操作系统使用virtual memory:进程看到的内存地址与物理地址不同,程序通常无法触及另一个进程拥有的内存。您似乎正在查看来自某个特定进程的内存转储,但地址0x00065580确实对应于不同的物理地址,例如0x00123456。在您自己的程序中,地址0x00065580将对应于另一个物理地址,例如0x00589263。操作系统将确保您的其他程序无法访问任何其他程序使用的物理地址。

如果您的流程以root用户身份运行,则可以use system calls to indirectly access other processes' memory

答案 1 :(得分:-1)

这是一个C ++程序,它将介绍如何打印特定内存位置的地址(或数据)。

#include<iostream>
using namespace std;
int main()
{
    int* arr = new int[10];
    int *start = NULL;
    int *end = NULL;

    for(int i=0;i<10;i++)
        arr[i] = i+1;
    start = arr;
    end = &arr[9];
    for(int *start=arr;start<end;start++)
        cout<<"  "<<start;
    cout<<endl;
    system("PAUSE");
    return 0;
}

我在粘贴的代码中看不到任何问题。但问题是START和END,即你在程序中使用的地址的位置。这些位置不包含该进程的任何有效内存,因此您强烈要求从某些垃圾内存空间读取数据,从而导致SEGFAULT。希望这会有所帮助。