C инициализировать массив внутри структуры

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

struct Grid { int rows; int cols; int grid[]; } int main() { struct Grid testgrid = {1, 3, {4, 5, 6}}; } 

Все, что я пробую, дает мне ошибку «ошибка: нестатическая инициализация элемента гибкого массива».

Вы можете сделать эту работу в gcc, сделав структуру static или глобальной, но оказывается, что инициализация элементов гибкого массива несоответствует, и поэтому она, скорее всего, не будет работать, кроме как с gcc. Вот способ сделать это, просто используя C99-совместимые функции …

 #include  #include  typedef struct Grid { int rows; int cols; int grid[]; } *Grid; Grid newGrid(int, int, ...); Grid newGrid(int rows, int cols, ...) { Grid g; va_list ap; int i, n = rows * cols; if((g = malloc(sizeof(struct Grid) + rows * cols * sizeof(int))) == NULL) return NULL; g->rows = rows; g->cols = cols; va_start(ap, cols); for(i = 0; i < n; ++i) g->grid[i] = va_arg(ap, int); va_end(ap); return g; } . . . Grid g1, g2, g3; g1 = newGrid(1, 1, 123); g2 = newGrid(2, 3, 1, 1, 1, 2, 2, 2); g3 = newGrid(4, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); 

Вот моя версия:

 #include  struct matrix { int rows; int cols; int **val; } a = { .rows=3, .cols=1, .val = (int*[3]){ (int[1]){1}, (int[1]){2}, (int[1]){3} } }, b = { .rows=3, .cols=4, .val = (int*[3]){ (int[4]){1, 2, 3, 4}, (int[4]){5, 6, 7, 8}, (int[4]){9,10,11,12} } }; void print_matrix( char *name, struct matrix *m ){ for( int row=0;rowrows;row++ ) for( int col=0;colcols;col++ ) printf( "%s[%i][%i]: %i\n", name, row, col, m->val[row][col] ); puts(""); } int main(){ print_matrix( "a", &a ); print_matrix( "b", &b ); } 

У вас нет массива переменной длины (VLA) в вашей структуре. То, что у вас есть в вашей структуре, называется гибким элементом массива . Элемент гибкого массива не имеет абсолютно никакого отношения к VLA. Элементы гибкого массива в C существуют, чтобы легализовать и поддерживать доброжелательную ирригацию «struct hack», которая основана на динамическом распределении памяти для объектов struct с трейлинг-массивами разного размера.

Элементы гибкого массива не могут быть инициализированы с помощью агрегатных инициализаторов, которые вы пытаетесь сделать в своем коде. То, что вы пытаетесь сделать здесь, просто невозможно. В C. такой функции нет.

Между тем текст сообщения об ошибке, сгенерированного вашим компилятором, кажется, предполагает, что он поддерживает что-то вроде этого как расширение. Это может быть правдой, но имейте в виду, что это никоим образом не является стандартной функцией C.

Я не считаю, что это возможно или поддерживается. Как отмечает DigitalRoss , вы можете инициализировать из литерала в случае static массивов … хотя я все еще не уверен, что это включено в Стандарт или просто для общего расширения. Кажется, я не могу найти предложение в стандарте, которое поддерживает литеральную инициализацию гибких массивов, хотя я вижу, что gcc явно поддерживает его .

Версия с использованием malloc:

 #include  #include  typedef struct Grid { int rows; int cols; int *grid; } Grid; /* Should validate params */ Grid buildGrid(int rows, int cols, int vec[]) { Grid grid; grid.rows = rows; grid.cols = cols; int i; if ( (grid.grid = malloc(sizeof(vec))) == NULL ) { /* do something.*/ } for(i = 0; i < sizeof(vec) ; i++ ) { grid.grid[i] = vec[i]; } return grid; } 
  • как устанавливать и получать поля в структурах Golang?
  • Как проверить, имеет ли переменная определенный тип (сравнивают два типа) в C?
  • ARC запрещает объекты Objective-C в структурах или объединениях, несмотря на маркировку файла -fno-objc-arc
  • Не уникальные значения enums
  • Быстрые константы: Struct или Enum
  • самореферентное определение структуры?
  • Является ли размер структуры требуемым, чтобы быть точным кратным выравниванию этой структуры?
  • Почему 16 байтов рекомендуемый размер для структуры в C #?
  • Как правильно назначить новое строковое значение?
  • C: указатель на структуру в определении структуры
  • Что нужно переопределить в структуре, чтобы обеспечить правильное функционирование равенства?
  • Interesting Posts

    Те же случайные числа каждый раз, когда я запускаю программу

    Автоматизировать передачу файла scp с использованием сценария оболочки

    Можете ли вы хранить компакт-диски / DVD-диски в огнестойком сейфе?

    Как установить Visual Studio 2010 Express где-нибудь, кроме C :?

    Сохранение состояния активности Android с использованием состояния Save Instance

    Как открыть монитор ресурсов в Windows 8?

    Невозможно создать и запустить проект тестирования андроида, созданный с помощью «ant create test-project», когда тестируемый проект имеет банки в каталоге libs

    Использование двоеточий для размещения двух операторов в одной строке в Visual Basic

    Имя файла журнала, в котором загружается процесс загрузки

    Icacls просматривает разрешения относительно корня папки?

    Доступ к event.target внутри обратного вызова в реакции

    Тестирование частного метода с использованием mockito

    Как остановить BackgroundWorker при закрытии формы?

    Как запустить JAR-файл

    Почему я получаю доступ к папке с данными при использовании adb?

    Давайте будем гением компьютера.