Инициализировать многомерный массив C с переменным размером до нуля

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

int myarray[10][10] = {0};

но он не работает, если я это сделаю:

int i = 10;
int j = 10;
int myarray[i][j] = {0};

Есть ли однострочный способ сделать это или мне нужно перебрать каждый элемент массива?

Спасибо

Ответ 1

Вы не можете инициализировать его инициализатором, но вы можете memset() массив равным 0.

#include <string.h>

int main(void) {
  int a = 13, b = 42;
  int m[a][b];
  memset(m, 0, sizeof m);
  return 0;
}

Примечание: это C99. В C89 объявление m (int m[a][b];) является ошибкой.

Ответ 2

Онлайн-стандарт C99 (проект n1256), раздел 6.7.8, абзац 3:

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

Акцент мой.

Как и все остальные, лучше всего использовать memset().

Ответ 3

Если вы указали указатель на свою структуру данных, вы можете попробовать memset.

Ответ 4

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

int i = 10;
int j = 10;
size_t nbytes = i*j*sizeof(int);
int* myarray = (int*) malloc(nbytes);
memset(myarray,0,nbytes);

Ответ 5

Двумерные массивы с переменным размером не поддерживаются в C. Одно измерение (я не могу вспомнить, если оно первое или второе) должно быть исправлено. Я рекомендую прокручивать его после его определения.