我对C ++很新。我正在尝试调用一个接收char **的函数:
bool func(char** a) {
//blablabla
}
所以它需要一个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 **"
最后我需要做:
char* a[] = {"banana", "apple"};
为什么前几个没有用,为什么最后一个有效?
提前致谢。
答案 0 :(得分:7)
你说你在使用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) {
..
}
如果您在编译时知道大小,甚至可以使用std::array
:
std::array<255, std::string> fixedArrayOfStrings
编辑:因为你需要在任何情况下构建一个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;
答案 1 :(得分:6)
你的代码有很多错误。
char** a = char[255][255]; // error: type name is not allowed
首先,这甚至不是有效的C ++(或者C就此而言)。也许你的意思是:
char a[255][255];
在任何情况下都要记住,二维动态分配的数组的类型不是**
而是(*)[N]
,这是非常不同的。
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"};
在上面的代码中,变量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
。
答案 2 :(得分:3)
char**
含糊不清 - 它可能意味着:
char* arr[]
而不是在第一种情况下,它非常简单:
char* niceString = GetNiceString();
func(&niceString);
然而,在第二种情况下,它稍微复杂一些。该函数不知道数组的长度,因此您需要使用NULL
显式结束它,就像例如environ
一样:
char* a[3] = { "One", "Two", NULL }; /* note that this is possibly dangerous
because you assign const char* (READ-ONLY) to char* (WRITABLE) */
func(a); // char*[] gets downgraded to char** implicitly
答案 3 :(得分:0)
所以char** a = char[255][255];
对C和C ++来说很奇怪
如果你想要一个静态的2d数组
char a[255][255];