C++ 无法从';T[N][2]';至';T[][2]和#x27;
我有一个API提供了一些选项: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}
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>与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>与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中无法直接实际复制数组(即,实际复制其内容),并且尝试复制函数也没有意义