17行报错 cannot convert 'char (*)[32]' to 'char**'
时间: 2023-12-24 14:04:56 浏览: 196
这个错误是因为 `iconv` 函数的参数类型与你传递的参数类型不匹配所导致的。
在你的代码中,第 17 行 `iconv` 函数的第二个参数应该是一个 `char**` 类型的指针,而你传递的是一个 `char (*)[32]` 类型的指针,这两个类型并不相同,因此编译器会报错。
要解决这个问题,你可以将第 15 行和第 16 行的代码改为:
```C++
char* utf8Buf = "hello, world!"; // 声明一个 UTF-8 编码的字符串
size_t utf8Len = strlen(utf8Buf);
char* gb2312Buf = new char[utf8Len * 2]; // 分配足够的空间来存储 GB2312 编码的字符串
iconv_t cd = iconv_open("GB2312", "UTF-8"); // 打开转换句柄
char* inbuf = utf8Buf;
char* outbuf = gb2312Buf;
iconv(cd, &inbuf, &utf8Len, &outbuf, &utf8Len * 2); // 进行转换
iconv_close(cd); // 关闭转换句柄
```
在修改后的代码中,我们首先将第 15 行的 `char[]` 类型的数组改为 `char*` 类型的指针。接着,我们在第 16 行中使用 `new` 运算符动态分配了一个足够大的空间来存储转换后的 GB2312 编码的字符串。
在第 19 行和第 20 行中,我们将 `&utf8Buf` 和 `&gb2312Buf` 分别改为 `&inbuf` 和 `&outbuf`,这样就能够将指向 `inbuf` 和 `outbuf` 的指针传递给 `iconv` 函数,解决了类型不匹配的问题。
最后,我们在代码的末尾使用 `delete[]` 运算符释放了动态分配的内存。
注意:在实际使用中,需要根据转换后的字符串长度来动态分配空间,否则可能会导致内存溢出。
阅读全文