2011-01-13 47 views
1

我有一个API采取一些选项:无法从转换 'T [N] [2]' 到 'T [] [2]'

void init_api(const char* options[][2]); 

我允许通过一个NULL指针为没有选项可替代地,一个选项阵列,例如这可以被传递:

const char* some_options[][2] = { {"opt1", "val1"}, 
            {"opt2", "val2"}, 
            {0,0} 
           }; 

作品没有问题:

... 
init_api(some_options); 
... or ... 
init_api(NULL); 
... 

然而,失败编译

const char* my_options[][2] = NULL; // error C2440: 'initializing' : cannot convert from 'int' to 'const char *[][2]' 
if(...) { 
    my_options = some_options; // error C2440: '=' : cannot convert from 'const char *[4][2]' to 'const char *[][2]' 
} 
init_api(my_options); // no error here 

这到底是怎么回事?有人可以解释这个吗?

回答

3

要声明指针为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 herited),阵列可被隐式转换为指针(虽然只有一次,也就是char[]是兼容char*char[][]char*[]但不`字符**兼容)。但是,变量不能被重新分配。所以在这里你需要使用一个指针而不是一个数组。

init_api选项接受NULL作为参数,因为编译器,它的原型是void init_api(char const* (*)[2])(第一阵列蜕变为指针),和NULL是有效的指针。

1
const char* options[][2] 

是一个const char *指针的数组。你不能指定一个指向数组的指针。

+0

为什么?这只是一个指针。当用作函数参数时它可以是NULL。 – 2011-01-13 09:54:03

+0

@Martin - False。数组衰减指针,但指向数组的指针从定义上来说不会是'NULL'。 – 2011-01-13 09:58:25

+0

@Chris:究竟是什么是虚假的*事实*,我*可以*传递NULL到一个函数参数T [] [2]? – 2011-01-13 10:06:56

3

编译器必须知道数组的大小。

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

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


编辑

在C++中(如C)中,数组可以衰变为指针,当您使用它们(有三个例外,它们不感兴趣这里)。

当你将一个数组传递给一个期待数组的函数时,会发生什么是你实际上传递了一个指向数组的指针,因为数组会衰减;您无法通过C或C++中的值传递数组。

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

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

1

声明为T[N]T[]类型的数组的参数实际上变成T*类型的参数。功能也是一样的(声明为R(Params)的参数实际上变成了R(*)(Params...)类型的参数)。

但是这样的转换不适用于其他声明。这是因为函数by-value参数完成的原因是C没有办法直接实际复制数组(即实际复制其内容),并且尝试复制函数也没有意义,所以这些参数以一种有意义的方式传递其目的。

因此,当您在函数参数大小写中初始化一个指针时,您正试图在另一种情况下初始化一个数组。

相关问题