我是C++的新手.我正在尝试调用一个接收char**的函数:
bool func(char** a) {
//blablabla
}
Run Code Online (Sandbox Code Playgroud)
所以它需要一个c字符串数组.我需要创建一个char**,但没有任何效果.
char** a = char[255][255]; // error: type name is not allowed
char** a = new char[255][255]; // error: a value of type "char (*)[255]" cannot be used to initialize an entity of type "char **"
char a[][] = {"banana", "apple"};
char** b = &a; // error: a value of type "<error-type> (*)[2]" cannot be used to initialize an entity of type "char **"
Run Code Online (Sandbox Code Playgroud)
最后我需要做:
char* a[] = {"banana", "apple"};
Run Code Online (Sandbox Code Playgroud)
为什么前几个不起作用,为什么最后一个有效?
提前致谢.
你说你在使用C++.然后,您可以轻松忽略const char*并char**专注于您可以使用的内容:
#include <string>
#include <vector>
std::vector<std::string> arrayOfStrings;
arrayOfStrings.push_back("foo");
bool func(const std::vector<std::string>>& a) {
..
}
Run Code Online (Sandbox Code Playgroud)
如果您在编译时知道大小,您甚至可以使用std::array:
std::array<255, std::string> fixedArrayOfStrings
Run Code Online (Sandbox Code Playgroud)
编辑:因为你需要在任何情况下构建一个C字符串数组,你可以从向量开始轻松地完成它:
const char **arrayOfCstrings = new const char*[vector.size()];
for (int i = 0; i < vector.size(); ++i)
arrayOfCstrings[i] = vector[i].c_str();
func(arrayOfCstrings);
delete [] arrayOfCstrings;
Run Code Online (Sandbox Code Playgroud)
你的代码有很多错误.
char** a = char[255][255]; // error: type name is not allowed
Run Code Online (Sandbox Code Playgroud)
首先,这甚至不是有效的C++(或C).也许你的意思是:
char a[255][255];
Run Code Online (Sandbox Code Playgroud)
在任何情况下总是记住二维动态分配的数组的类型不是,**但是(*)[N]非常不同.
char** a = new char[255][255]; // error: a value of type "char (*)[255]" cannot be used to initialize an entity of type "char **"
Run Code Online (Sandbox Code Playgroud)
您在评论中提供的错误消息正好解释了我之前所说的内容.
char a[][] = {"banana", "apple"};
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,变量的正确类型a应该是char* a[].同样,数组和指针(对于类型而言)是非常不同的东西.甲char阵列可以衰减到指针(如果NULL 终止),但对于其余部分,除与显式转换,则不能使用指针和数组等你在做什么.
最后一个工作是因为,正如我之前所说,char* []是C字符串数组的正确类型.
无论如何,如果你只做功课,可以学习这些东西.但在使用C++未来的发展:尽量不要使用与启动"特色" C-,像C字符串,C-阵列等C++标准库给你std::string,std::array,std::vector和这样的免费.
如果你真的需要分配动态内存(用new和delete,或new[]和delete[])请使用智能指针,如std::shared_ptr或std::unique_ptr.
| 归档时间: |
|
| 查看次数: |
28714 次 |
| 最近记录: |