GCC предупреждение о назначении указателя переменной с массивом? - PullRequest
2 голосов
/ 24 апреля 2019

фрагмент кода:

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 *?Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Инициализаторы в квадратных скобках не являются массивами и поэтому не могут быть подвержены типу указателя. И поскольку c является массивом int *, каждый инициализатор должен быть этого типа. Вложенные инициализаторы работают только с реальными массивами (не указателями) или структурами.

Однако вы можете использовать составные литералы в инициализаторе, который имеет тип массива.

int *c[2] = {(int []){1,2,3}, (int []){4,5,6}};
1 голос
/ 24 апреля 2019

Я полагаю, что массив {1,2,3} будет распадаться на указатель, поэтому присвоение будет допустимым?

Нет. {1, 2, 3} не является массивом, и к нему не применяется распад. Это инициализатор, подходящий для инициализации массива из трех или более элементов арифметического типа, но вы пытаетесь использовать его для инициализации указателя. Вместо этого вы можете сделать что-то вроде этого:

static int x[] = { 1, 2, 3 };
static int y[] = { 4, 5, 6 };
int *c[] = { x, y };

Или вы можете использовать составные литералы, чтобы избежать объявления переменных x и y, как предполагает другой ответ. В любом из этих случаев элементы инициализатора являются массивами, и они делают распадающимися на указатели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...