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

如何在C++中将命令行传入的指针地址字符串转换为内存地址

C++中将十六进制字符串转换为指针地址的方法

要把命令行传入的十六进制地址字符串(比如"0x7fad529d5000")转换成指针,核心思路是先将字符串解析为无符号整数,再通过类型转换得到指针。以下是两种可靠的实现方式:

方法1:使用C标准库的strtoull

strtoull可以直接解析带0x前缀的十六进制字符串,返回unsigned long long类型的值,再通过reinterpret_cast转换为指针:

#include <iostream>
#include <cstdlib>

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << "用法: " << argv[0] << " <十六进制地址>\n";
        return 1;
    }

    // 解析十六进制字符串为unsigned long long
    unsigned long long addr_num = strtoull(argv[1], nullptr, 16);
    // 转换为void*指针(也可根据需求转为特定类型指针,如int*)
    void* target_ptr = reinterpret_cast<void*>(addr_num);

    std::cout << "转换后的指针地址: " << target_ptr << std::endl;

    return 0;
}

方法2:使用C++11及以上的std::stoull

std::stoull是C标准库的函数,相比strtoull会抛出异常处理错误场景,更符合C的异常处理风格:

#include <iostream>
#include <string>
#include <stdexcept>

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << "用法: " << argv[0] << " <十六进制地址>\n";
        return 1;
    }

    try {
        // 解析十六进制字符串,自动识别0x前缀
        unsigned long long addr_num = std::stoull(argv[1], nullptr, 16);
        void* target_ptr = reinterpret_cast<void*>(addr_num);
        std::cout << "转换后的指针地址: " << target_ptr << std::endl;
    } catch (const std::invalid_argument& e) {
        std::cerr << "错误:输入不是有效的十六进制地址 - " << e.what() << "\n";
        return 1;
    } catch (const std::out_of_range& e) {
        std::cerr << "错误:地址值超出范围 - " << e.what() << "\n";
        return 1;
    }

    return 0;
}

关键注意事项

  • 类型兼容性:用unsigned long long是为了兼容64位系统(32位系统用unsigned long也可,但unsigned long long通用性更强)。
  • 指针转换:必须使用reinterpret_cast进行整数到指针的转换,这是C++标准允许的操作,比C风格强制转换更清晰。
  • 地址有效性:转换后的指针必须指向合法的内存区域,否则访问该指针会触发未定义行为(比如程序崩溃)。
  • 前缀处理:两种方法都能自动识别0x前缀,即使输入不带0x(纯十六进制数字),只要第三个参数设为16就能正确解析。

内容的提问来源于stack exchange,提问作者Mobi Zaman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:41:03