You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串形式的内存地址转换为void*指针以调用ReadFile函数

字符串转void*指针的实现方案

十六进制地址字符串转指针的方法

要把"0xffffffff"这类十六进制格式的地址字符串转换成void*指针,可通过字符串转无符号整数再强制类型转换实现:

  1. 使用strtoull()(适配32/64位系统)或strtoul()解析十六进制字符串,得到对应的无符号整数值
  2. 将整数值强制转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:35:18