C语言中如何通过void指针修改原字符串变量的指向?
问题分析与解决方案
你的代码输出"old"是因为options[0].value存储的是原value指针的副本,修改这个副本的指向只会改变结构体成员自身的值,不会影响原value变量的指向。
要实现通过结构体里的指针修改原变量的指向,你需要存储原指针的地址(即指针的指针),而不是指针本身。具体步骤如下:
- 将结构体的成员类型从
void*改为void**,用来保存原指针的地址 - 初始化结构体时传入
&value(原指针的地址) - 修改时通过解引用这个二级指针,改变原指针的指向
修改后的代码示例:
#include <stdio.h> char *value = "old"; struct ConfigOpt { void **value; // 改为二级指针 }; struct ConfigOpt options[] = { {&value} // 传入原指针的地址 }; // 通过解引用二级指针,修改原变量的指向 *(char**)options[0].value = "new"; printf("%s", value); // 现在会输出"new"
说明
- 这里用
(char**)做强制类型转换是因为void**需要转为对应类型的指针才能正确解引用,确保类型匹配 - 这种方式不需要预分配字符串,直接使用字符串字面量的指针即可实现需求
内容的提问来源于stack exchange,提问作者expoodo
相关产品推荐
相关产品推荐

