编译报错:无法将char*(*)[6]转换为char***,求代码修复方法
编译错误修复:Cannot convert 'char*()[6]' to 'char**'
咱们先把这个错误的根源说透:你遇到的类型不匹配问题,本质是函数参数的类型和你传入的变量类型完全不兼容,编译器根本没法帮你做隐式转换。
错误拆解
- 你定义的
prac函数第二个参数是char **b[],在C++里,数组作为函数参数会自动退化为指针,所以这个参数等价于char ***b——简单说就是“指向指针的指针的指针”。 - 而你在
main里传入的&ptr_array,ptr_array是一个char*[6]类型的固定大小数组,它的地址类型是char*(*)[6]——也就是“指向一个包含6个char*元素的数组的指针”。这俩类型的语义完全不同,编译器自然会报错。
另外还要提一句:你原来main里的&argc是个问题——如果你的main函数没有声明int argc, char** argv,那argc是未定义的变量,这也会导致编译错误,下面的修复代码里我会一起修正这个点。
修复方案(两种场景)
场景1:只想传递字符串数组给函数(最常见需求)
如果你只是想把ptr_array里的字符串传递给prac处理,不需要传递整个数组的地址,直接传数组名就行——因为数组名会自动退化为指向第一个元素的指针(类型是char**),这时候我们需要调整函数的参数类型:
#include <iostream> using namespace std; // 修改第二个参数为char**,匹配数组退化后的指针类型 void prac(int *argc, char **b) { // 举个例子:打印数组第一个元素 cout << "第一个元素:" << b[0] << endl; // 遍历整个数组(这里我们通过传入的argc知道长度) for (int i = 0; i < *argc; ++i) { cout << "元素" << i << ": " << b[i] << endl; } } int main() { char *ptr_array[] = {"ssl","0.0.0.0","","tcp","0.0.0.0","8080"}; // 自动计算数组长度,传给prac函数 int arr_len = sizeof(ptr_array) / sizeof(ptr_array[0]); // 直接传数组名,不需要取地址 prac(&arr_len, ptr_array); return 0; }
场景2:需要传递整个数组的指针(比如要利用数组的固定大小信息)
如果你确实需要传递整个数组的地址(比如在函数里要依赖数组的固定长度),那就要把函数的参数类型改成char*(*b)[6],明确表示这是一个指向包含6个char*元素的数组的指针:
#include <iostream> using namespace std; // 参数改为指向char*[6]数组的指针 void prac(int *argc, char*(*b)[6]) { // 访问数组元素需要先解引用指针,再用下标 cout << "第一个元素:" << (*b)[0] << endl; // 因为知道数组固定是6个元素,可以直接遍历 for (int i = 0; i < 6; ++i) { cout << "元素" << i << ": " << (*b)[i] << endl; } } int main() { char *ptr_array[] = {"ssl","0.0.0.0","","tcp","0.0.0.0","8080"}; int arr_len = 6; // 这里传&ptr_array是正确的,类型完全匹配 prac(&arr_len, &ptr_array); return 0; }
内容的提问来源于stack exchange,提问作者user8178737
相关产品推荐
相关产品推荐

