инициализация структуры не удалась - PullRequest
1 голос
/ 05 октября 2019
 int main()
{
    int i;
    typedef struct {
        int no[6];
        int socket;
    }data;

    data  *a = {
        a->no[6] = {0},
        a->socket= 3,
    };

    printf( "no[0] = %d\n",a->no[0]);
    printf("socket  = %d\n", a->socket);

    getchar();
    return 0;
}

В этом простом коде я создал структуру и инициализировал ее, используя указатель структуры - присваивая 0 значение всем элементам массива 'no' и значение 3 переменному сокету. Я получаю сообщение об ошибке: ошибка C2440: «инициализация»: невозможно преобразовать из «списка инициализаторов» в «данные *». Примечание: инициализатор содержит слишком много элементов

. Я также попытался с

    data  a = {
        a.no[6] = {0},
        a.socket= 3,
    };
  printf("no0 = %d\n",a.no[0]);
    printf("socket  = %d\n", a.socket);

здесь код работает, но вместо 3. отображается * .socket = 0.

1 Ответ

3 голосов
/ 05 октября 2019

Эта декларация

data  *a = {
    a->no[6] = {0},
    a->socket= 3,
};

не имеет смысла. Если вы хотите объявить указатель на структуру, вы можете использовать либо составной литерал, например

data *a = ( data[] ){ { { 0 }, 3 } };

, либо динамически выделять объект типа данных.

data *a = malloc( sizeof( data ) );
a->no[0] = 0;
a->socket = 3;

Если выне хотите объявлять указатель, тогда вы можете написать следующий способ, как показано в демонстрационной программе

#include <stdio.h>

typedef struct {
    int no[6];
    int socket;
} data;

int main(void) 
{
    data a = { { [0] = 0 } , .socket = 3 };
    printf( "no0 = %d\n",a.no[0] );
    printf("socket  = %d\n", a.socket);

    return 0;
}

Выходные данные программы:

no0 = 0
socket  = 3
...