GCC关于为数组分配指针变量的警告?

时间:2019-04-24 18:00:58

标签: c arrays

代码段:

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 typeint *?预先感谢!

2 个答案:

答案 0 :(得分:3)

括弧式初始化程序不是数组,因此不能衰减为指针类型。并且由于cint *的数组,因此每个初始化程序都必须是该类型。嵌套的初始化程序仅适用于实际的数组(不适用于指针)或结构。

但是,您可以做的是在初始化器中使用具有数组类型的复合文字

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 };

或者您可以使用复合文字来避免声明变量xy,如另一个答案所建议的那样。在这两种情况下,初始化器元素都是数组,它们 do 会衰减到指针。