16

我对 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

4 回答 4

10

你的代码有很多错误。

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

如果你真的需要分配动态内存(使用newand delete, or new[]and delete[])请使用智能指针,比如std::shared_ptror std::unique_ptr

于 2013-09-18T10:30:52.400 回答
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;
于 2013-09-18T10:06:16.670 回答
3
char**

模棱两可 - 它可能意味着:

  1. 指向指针的指针
  2. char* arr[]c 字符串数组 - 有经验的程序员会改为编写

在第一种情况下,它非常简单:

char* niceString = GetNiceString();
func(&niceString);

但是在第二种情况下,它稍微复杂一些。该函数将不知道数组的长度,因此您需要以 a 显式结束它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
于 2013-09-18T11:07:47.963 回答
0

所以char** a = char[255][255];这对 C 和 C++ 来说很奇怪,如果你想要一个静态二维数组

char a[255][255];
于 2013-09-18T10:26:46.010 回答