C++中如何将void*强制转换回vector<char*>并打印内容
实现步骤
要把传入的void*还原为std::vector<char*>类型,核心逻辑是匹配传入时的指针层级:你在main里传入的是vector变量的地址,因此void*本质是指向vector的一级指针,转换时先还原指针类型再解引用即可。
- 转换优先使用C++标准提供的
static_cast,避免C风格强转的类型安全隐患:将void*转为std::vector<char*>*(指向vector<char*>的指针) - 对转换后的指针解引用,就能拿到原始的vector对象
- 遍历vector的每个元素,即可打印存储的字符串内容
完整可运行代码
#include <iostream> #include <vector> #include <string> void testFunction(void* data){ // 将void*转回指向vector<char*>的指针 std::vector<char*>* target_vec = static_cast<std::vector<char*>*>(data); // 遍历解引用后的vector,打印每个存储的字符串 for (char* content : *target_vec) { std::cout << "存储的内容为:" << content << std::endl; } } int main() { std::vector<char*> arg(1); std::string someString = "testString"; // 注意c_str()返回const char*,用const_cast比C风格强转语义更明确,且禁止后续修改该指针指向的内容 arg[0] = const_cast<char*>(someString.c_str()); testFunction(&arg); return 0; }
注意事项
- 这种
void*传参的方式完全没有编译期类型检查,你必须保证转换时指定的类型和实际传入的类型完全一致,否则会出现内存访问错误、值错乱等未定义行为std::string::c_str()返回的是只读的常量字符串指针,转成char*后绝对不要尝试修改指向的内存内容,否则会导致程序崩溃- 日常C++开发如果不是必须对接C风格接口,尽量避免用
void*传递任意类型参数,优先使用模板、std::any等类型安全的方式实现泛型传参
内容的提问来源于stack exchange,提问作者lastpeony4
相关产品推荐
相关产品推荐

