如何将字符串形式的内存地址转换为void*指针以调用ReadFile函数
字符串转void*指针的实现方案
十六进制地址字符串转指针的方法
要把"0xffffffff"这类十六进制格式的地址字符串转换成void*指针,可通过字符串转无符号整数再强制类型转换实现:
- 使用
strtoull()(适配32/64位系统)或strtoul()解析十六进制字符串,得到对应的无符号整数值 - 将整数值强制转换为
void*类型
示例代码:
char *addr_str = "0xffffffff"; unsigned long long addr_val = strtoull(addr_str, NULL, 16); // 16表示按十六进制解析 void *p = (void *)addr_val;
如果需要处理转换失败的情况(比如输入不是合法十六进制字符串),可以通过strtoull的第二个参数判断:
char *endptr; unsigned long long addr_val = strtoull(addr_str, &endptr, 16); if (endptr == addr_str) { // 转换失败,输入不是有效的十六进制地址 fprintf(stderr, "Invalid address format\n"); return -1; }
你的代码修正点
注意到你提供的ReadFile函数中有两处错误:
- 两次调用
close(df),变量名应为fd(你打开的文件描述符是fd),否则会编译报错或触发未定义行为
修正后的ReadFile函数片段:
if ((n = read(fd, p, cont)) == -1) { perror("ERROR: "); close(fd); // 修正为fd return -1; } printf("Read %ld bytes from %s in %p\n", n, f, p); close(fd); // 修正为fd
完整调用示例
假设你已经完成输入字符串的拆分,得到文件名、地址字符串、长度字符串,完整调用逻辑如下:
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int ReadFile(char *f, void *p, ssize_t cont) { struct stat s; ssize_t n; int fd; if (stat(f, &s) == -1 || (fd = open(f, O_RDONLY)) == -1) { perror("ERROR: "); return -1; } if (cont == -1) cont = s.st_size; if ((n = read(fd, p, cont)) == -1) { perror("ERROR: "); close(fd); return -1; } printf("Read %ld bytes from %s in %p\n", n, f, p); close(fd); return 0; } int main() { // 模拟输入拆分结果 char *filename = "file.txt"; char *addr_str = "0xffffffff"; char *count_str = "15"; // 转换地址 char *endptr; unsigned long long addr_val = strtoull(addr_str, &endptr, 16); if (endptr == addr_str) { fprintf(stderr, "Invalid address\n"); return 1; } void *p = (void *)addr_val; // 转换读取长度 ssize_t cont = atoll(count_str); // 调用读取函数 return ReadFile(filename, p, cont); }
重要注意事项
直接写入任意内存地址存在极高风险:
- 如果目标地址是内核空间、只读内存区域或不属于当前进程的内存,写入操作会触发段错误(Segmentation Fault)
- 仅在明确目标地址是合法可写的进程内存区域时,才建议使用该逻辑
内容的提问来源于stack exchange,提问作者jamondebellota
相关产品推荐
相关产品推荐

