如何在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
相关产品推荐
相关产品推荐

