Назначенный массив инициализатора в C - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь инициализировать массив структуры с помощью назначенного инициализатора:

A[size].from = {[0 ... size - 1] = 0};
A[size].to = {[0 ... size - 1] = 0};

List.h:

typedef struct Buffer
{
    int from;
    int to;
}buffer_t;
typedef struct shared_memory
{
buffer_t A;
int size;
} share_t

Main. c

#include <stdio.h>    
#include "list.h"  
buffer_t A[];
int size;
void main(int argc, char *argv[])
{
    share->share_t *share = (share_t *)malloc(sizeof(share_t));
    long arg = strtol(argv[1], NULL, 10);
    size = arg;
    share->A[size] = {[0 ... size-1] = 0};
}

Однако я получаю следующую ошибку:

введите описание изображения здесь

Я использую MinGW g cc и командную строку для компиляции код, и я пишу этот код в Visual Studio.

1 Ответ

1 голос
/ 30 апреля 2020

Ваш код является выражением присваивания, а не инициализатором. Инициализация может произойти только тогда, когда объект определен.

Кроме того, массивы должны быть определены с размером. И есть лучшие способы инициализации объекта нулями, чем пытаться использовать назначенные диапазоны инициализатора.

Вот два варианта:

int main(int argc, char *argv[])
{
    long size = strtol(argv[1], NULL, 10);
    buffer_t A[size];
    memset(&A, 0, sizeof A);

или

buffer_t *A;
size_t size;

int main(int argc, char *argv[])
{
    size = strtol(argv[1], NULL, 10);
    A = calloc(size, sizeof *A);  // already zero-initialized

Последнее, вероятно, лучше в том смысле, что вы можете проверить наличие ошибок выделения, и оно поддерживает большие выделения.

...