c-验证是否分配了内存地址

c-验证是否分配了内存地址,c,memory,process,C,Memory,Process,我正试图完成一个项目,目标如下: 取一个表示内存地址的十六进制数的参数。如果地址在进程的虚拟内存中,则打印位于该地址的内存单字节的值。如果没有,退出 这是我目前掌握的代码: int main(int argc,char const*argv[]){ 无符号长ret_adr=strtoul(argv[1],NULL,16); int pid=getpid(); 文件*文件; 字符c[1000]; 字符文件地址[20]; sprintf(文件地址,“/proc/%d/maps”,pid); puts

我正试图完成一个项目,目标如下:

取一个表示内存地址的十六进制数的参数。如果地址在进程的虚拟内存中,则打印位于该地址的内存单字节的值。如果没有,退出

这是我目前掌握的代码:

int main(int argc,char const*argv[]){
无符号长ret_adr=strtoul(argv[1],NULL,16);
int pid=getpid();
文件*文件;
字符c[1000];
字符文件地址[20];
sprintf(文件地址,“/proc/%d/maps”,pid);
puts(文件地址);
if((file=fopen(file_addr,“r”))==NULL){
printf(“错误!打开文件\n”);
//如果文件指针返回NULL,程序将退出。
出口(1);
}
while(fgets(c,sizeof(c),file)!=NULL){
printf(“%s\n”,c);
睡眠(1);
}
printf(“pid:%d\n”,pid);
无符号长*p=(无符号长*)ret_adr;
无符号长首_字节=p[0];
printf(“%lu\n”,第一个字节);
返回0;
}
我可以访问
/proc//maps
,但我不知道如何验证
ret\u adr
是否在地图中

在代码的底部,我尝试获取地址的指针,然后获取该指针的字节。但我不相信这是正确的答案,因为地址本身应该是“指针”,而不是该变量的指针

这是我的终端供参考:

[task1]$ setarch x86_64 -R ./task1 400000
/proc/30879/maps
pid: 30879
282584257676671

您可以手动解析映射文件


但是,Unix中还有一个技巧一直存在:尝试使用指针作为缓冲区调用
write
函数,并将文件描述符打开到
/dev/null
。如果内存地址是好的,它将成功。如果不是,则在
errno
中获得错误代码
EFAULT

无符号长ret\u adr=strtoul(…)比无符号长ret_adr=strtol(…)更有意义添加
l
。如果我手动解析地图文件,我在寻找什么?地址在什么范围内?@lex449-re:我在找什么<代码>默认值
。再看一遍建议:)。他已经回答了那个问题。(即,如果内存地址良好,则会成功。如果不是,则会在errno中获得错误代码'EFAULT'。