代码段:
int *c[2] = {{1,2,3}, {4,5,6}};
给出警告:
warning: incompatible integer to pointer conversion initializing 'int *' with an expression of type 'int'
[-Wint-conversion]
int *c[2] = {{1,2,3}, {4,5,6}};
^
warning: excess elements in scalar initializer
int *c[2] = {{1,2,3}, {4,5,6}};
^
我想数组{1,2,3}
会衰减到指针,所以分配是合法的?
此外,根据警告,编译器为什么会认为我正在尝试将int
分配给int *
?而不是int array type
至int *
?预先感谢!
答案 0 :(得分:3)
括弧式初始化程序不是数组,因此不能衰减为指针类型。并且由于c
是int *
的数组,因此每个初始化程序都必须是该类型。嵌套的初始化程序仅适用于实际的数组(不适用于指针)或结构。
但是,您可以做的是在初始化器中使用具有数组类型的复合文字。
int *c[2] = {(int []){1,2,3}, (int []){4,5,6}};
答案 1 :(得分:1)
我想数组{1,2,3}会衰减到指针,所以分配是合法的?
不。 {1, 2, 3}
不是数组,并且没有衰减适用于它。它是一个初始化程序,适用于初始化由三个或更多算术类型的元素组成的数组,但是您尝试使用它来初始化指针。您可以执行以下操作:
static int x[] = { 1, 2, 3 };
static int y[] = { 4, 5, 6 };
int *c[] = { x, y };
或者您可以使用复合文字来避免声明变量x
和y
,如另一个答案所建议的那样。在这两种情况下,初始化器元素都是数组,它们 do 会衰减到指针。