我想创建一个2D字符串数组,所以我尝试:
char **value[] = {"integer", "char", "string", "octal", "hexa_min", "hexa_maj", "pointer", "integer", "bin_int", "non_printable", "unsigned_int", NULL};
但我对我阵列的每个str都有一个警告。
感谢您的帮助;)
答案 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指针。正确的决定取决于你是否要更改数组的元素,在这种情况下你必须使用二维数组,否则你不会改变数组的元素,在这种情况下你应该使用一个 - 维数组。