初始化char**

Boy*_*ang 11 c++ string

我是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)

为什么前几个不起作用,为什么最后一个有效?

提前致谢.

Jac*_*ack 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) {
  ..
}
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)

  • 但功能是固定的,不是我写的.它被声明为"bool func(char**a)".我无法改变这一点. (3认同)

Sho*_*hoe 7

你的代码有很多错误.

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和这样的免费.

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