C 2D char数组("来自不兼容指针的警告初始化")

时间:2017-11-19 10:28:54

标签: c arrays pointers declaration

我想创建一个2D字符串数组,所以我尝试:

char **value[] = {"integer", "char", "string", "octal", "hexa_min", "hexa_maj", "pointer", "integer", "bin_int", "non_printable", "unsigned_int", NULL};

但我对我阵列的每个str都有一个警告。

https://pastebin.com/bwJtB1CR

感谢您的帮助;)

2 个答案:

答案 0 :(得分:1)

char value[12][30] = {
"integer",
 "char", 
"string", 
"octal", 
"hexa_min", 
"hexa_maj",
 "pointer", 
"integer", 
"bin_int", 
"non_printable", 
"unsigned_int", 
"NULL"};

始终记住您在声明2D数组时如下: array2D [No_Of_Rows] [No_Of_Coloums];

答案 1 :(得分:0)

对于初学者这个记录

char **value[] = /*...*/;

并不意味着声明2D数组。它是一维数组元素的声明,其类型为char **

此声明中的数组元素类型和初始值设定项类型

char **value[] = {"integer", "char", "string", "octal", "hexa_min", "hexa_maj", "pointer", "integer", "bin_int", "non_printable", "unsigned_int", NULL};

不相容。

根据C标准(6.3.2.1 Lvalues,数组和函数指示符)

  

3除非它是sizeof运算符或一元&的操作数。   operator,或者是用于初始化数组的字符串文字,a   具有类型''数组类型''的表达式将转换为   带有''指向类型'的指针的表达式,指向初始值   数组对象的元素,而不是左值。如果是数组对象   具有寄存器存储类,行为未定义。

C中的字符串文字具有字符数组类型。例如,字符串文字"integer"的类型为char[8]。正如引用所说,用作初始化器的字符串文字被隐式转换为类型char *的指针,指向字符串文字的第一个字符。

因此,在声明中,使用了char *类型的初始值设定项,而声明的对象的类型为char **

编写

是正确的
char *value[] = {"integer", "char", "string", "octal", "hexa_min", "hexa_maj", "pointer", "integer", "bin_int", "non_printable", "unsigned_int", NULL};

但正如已经提到的那样,它是一个char *类型的一维指针数组的声明。对于处理字符串的大多数任务来说,这样的声明是合适的。

如果你想确实声明一个二维数组,那么你应该计算字符串文字的最大大小,包括终止零。用作初始值设定项的Rge最大字符串文字为"non_printable",其类型为char[14]。 因此,二维字符数组应按以下方式声明。考虑到应删除初始化程序NULL

char value[][14] = {"integer", "char", "string", "octal", "hexa_min", "hexa_maj", "pointer", "integer", "bin_int", "non_printable", "unsigned_int" };

但似乎你需要的是上面显示的一维数组pf指针。正确的决定取决于你是否要更改数组的元素,在这种情况下你必须使用二维数组,否则你不会改变数组的元素,在这种情况下你应该使用一个 - 维数组。