初始化char **

时间:2013-09-18 10:02:59

标签: c++ string

我对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"};

为什么前几个没有用,为什么最后一个有效?

提前致谢。

4 个答案:

答案 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::stringstd::arraystd::vector以及此类免费

如果确实需要分配动态内存(newdelete,或new[]delete[]),请使用智能指针,例如std::shared_ptrstd::unique_ptr

答案 2 :(得分:3)

char**

含糊不清 - 它可能意味着:

  1. 指向指针的指针
  2. c-strings数组 - 有经验的程序员会写char* arr[]而不是
  3. 在第一种情况下,它非常简单:

    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];