Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法从';T[N][2]';至';T[][2]和#x27;_C++ - Fatal编程技术网

C++ 无法从';T[N][2]';至';T[][2]和#x27;

C++ 无法从';T[N][2]';至';T[][2]和#x27;,c++,C++,我有一个API提供了一些选项: void init_api(const char* options[][2]); 我被允许传递一个空指针来表示没有选项,或者,可以传递这样的选项数组: const char* some_options[][2] = { {"opt1", "val1"}, {"opt2", "val2"}, {0,0}

我有一个API提供了一些选项:

void init_api(const char* options[][2]);
我被允许传递一个空指针来表示没有选项,或者,可以传递这样的选项数组:

const char* some_options[][2] = { {"opt1", "val1"}, 
                                  {"opt2", "val2"}, 
                                  {0,0} 
                                };
这样做没有问题:

...
init_api(some_options);
... or ...
init_api(NULL);
...
但是,这无法编译:

这是怎么回事?有人能解释一下吗

const char* options[][2]  
是常量char*指针的数组。不能将指针分配给数组


是常量char*指针的数组。无法将指针分配给数组。

要声明指向常量字符的指针数组的空数组,应使用:

const char* my_options[][2] = {};
您需要声明指向指向const char的指针数组的指针。我建议使用typedef来简化语法

typedef const char* array_of_two_cstring[2];
array_of_two_cstring* my_options = NULL;
if (...) {
    my_options = some_options;
}
init_api(my_options);
在C++中(从c中派生),数组可以隐式转换为指针(仅一次,即<代码> char []/Cord>与char */COD>兼容,但是<代码> char [][COD] >与<代码> char *[] <代码>但不'char *]兼容。但是,无法重新分配该变量。因此,这里需要使用指针而不是数组


init_api
选项接受
NULL
作为参数,因为对于编译器来说,它的原型是
void init_api(char const*(*)[2])
(第一个数组退化为指针),
NULL
是一个有效指针。

要声明指向const char的指针数组的空数组,应该使用:

const char* my_options[][2] = {};
您需要声明指向指向const char的指针数组的指针。我建议使用typedef来简化语法

typedef const char* array_of_two_cstring[2];
array_of_two_cstring* my_options = NULL;
if (...) {
    my_options = some_options;
}
init_api(my_options);
在C++中(从c中派生),数组可以隐式转换为指针(仅一次,即<代码> char []/Cord>与char */COD>兼容,但是<代码> char [][COD] >与<代码> char *[] <代码>但不'char *]兼容。但是,无法重新分配该变量。因此,这里需要使用指针而不是数组


init\u api
选项接受
NULL
作为参数,因为对于编译器来说,它的原型是
void init\u api(char const*(*)[2])
(第一个数组退化为指针),
NULL
是有效指针。

编译器必须知道数组大小

如果省略数组的大小(即:使用
[]
),则需要使用定义初始化数组,以便编译器计算该数组将包含多少项

此外,您正在将指针(
NULL
)分配给数组:
const char*x[][2]
是一个由两个指针组成的数组,指向
const char


编辑

<>在C++中(如C),数组在使用时会变成指针(这里有三个例外,这里没有意思)。 当你把一个数组传递给一个需要数组的函数时,你实际上传递了一个指向数组的指针,因为数组会衰减;不能在C或C++中按值传递数组。

因此,您可以将
NULL
传递给您的函数;函数参数将为
NULL
,如果您试图访问函数中的数组(
options[0]
),您的应用程序将崩溃:您将取消对无效指针的引用


但是,您不能将数组变量设置为NULL,因为它不是指针,而是数组:只有在表达式中使用它时,它才会衰减。

编译器必须知道数组大小

如果省略数组的大小(即:使用
[]
),则需要使用定义初始化数组,以便编译器计算该数组将包含多少项

此外,您正在将指针(
NULL
)分配给数组:
const char*x[][2]
是一个由两个指针组成的数组,指向
const char


编辑

<>在C++中(如C),数组在使用时会变成指针(这里有三个例外,这里没有意思)。 当你把一个数组传递给一个需要数组的函数时,你实际上传递了一个指向数组的指针,因为数组会衰减;不能在C或C++中按值传递数组。

因此,您可以将
NULL
传递给您的函数;函数参数将为
NULL
,如果您试图访问函数中的数组(
options[0]
),您的应用程序将崩溃:您将取消对无效指针的引用


但是,您不能将数组变量设置为
NULL
,因为它不是指针,而是数组:只有在表达式中使用它时,它才会衰减。

声明为
T[N]
T[]
类型的数组的参数实际上成为
T*
类型的参数。函数也是如此(声明为
R(Params)
的参数实际上变成了
R(*)(Params…
)类型的参数)

但是,对于其他声明,不会进行这种转换。对按值函数参数执行此操作的原因是,在C中无法直接实际复制数组(即,实际复制其内容),并且尝试复制函数也没有意义,因此此类参数的转换方式以有意义的方式传达其目的


因此,当您在函数参数情况下初始化指针时,您正在尝试在另一种情况下初始化数组。

声明为
T[N]
T[]
类型数组的参数实际上成为
T*
类型的参数。函数也是如此(声明为
R(Params)
的参数实际上变成了
R(*)(Params…
)类型的参数)

但是,对于其他声明,不会进行这种转换。对按值函数参数执行此操作的原因是,在C中无法直接实际复制数组(即,实际复制其内容),并且尝试复制函数也没有意义