尝试用字符串数组初始化char**指针报错,寻求技术指导
关于char*与char**初始化的问题解析
首先明确你的错误根源:char** 是指向指针的单个指针,不能直接用一组字符串字面量初始化,这和char*的情况本质不同。
先回顾单指针的正确逻辑
你之前的代码:
char arry[] = "Hello World"; // 栈上分配数组,内容可修改 char* cptr = "Hello World"; // 指针指向只读内存中的字符串字面量
这里char* cptr能直接用字符串字面量初始化,是因为字符串字面量"Hello World"会被编译器放在只读数据段,它的类型是char[12],可以隐式转换为指向首元素的char*指针,所以赋值合法。
双指针初始化错误的原因
看你写的代码:
char *darry[] = {"Hello", "World", "C", "Ubuntu"}; // 正确:这是一个char*类型的数组,每个元素指向对应字符串字面量 char **da = {"Hello", "World", "C", "Ubuntu"}; // 错误:类型不匹配+初始化方式错误
char *darry[]是数组,类型为char*[4],数组的每个位置可以分别用字符串字面量(隐式转char*)初始化,完全合法。- 而
char** da是单个指针变量,它只能存储一个char*类型的地址。你用一组字符串字面量初始化,相当于给单个指针塞了多个值,编译器自然报错;同时{"Hello", ...}的类型是char*[4],和char**虽然有隐式转换的场景,但直接初始化单个指针时不允许这么用。
正确初始化char**的两种方式
方式1:借助字符串数组
先定义合法的字符串数组,再让双指针指向数组的首元素(数组名会隐式转换为指向首元素的指针):
char *darry[] = {"Hello", "World", "C", "Ubuntu"}; char **da = darry; // 此时da指向darry数组的第一个元素(即指向"Hello"的指针)
方式2:使用复合字面量(C99及以上标准支持)
直接用复合字面量创建临时的char*数组,再转换为char**:
char **da = (char*[]){"Hello", "World", "C", "Ubuntu"};
这种方式不需要单独定义数组,适合临时使用的场景,但要注意复合字面量的生命周期(如果在函数内定义,退出函数后临时数组会被销毁,此时da会变成野指针)。
内容的提问来源于stack exchange,提问作者toor_49
相关产品推荐
相关产品推荐

