Почему не возникает ошибки, когда я объявляю матрицу, размерность которой равна 0 в C?

#c #matrix #multidimensional-array #struct

Вопрос:

Поэтому я потратил около 1 часа, проверяя, что не так с моим кодом, прежде чем увидел, что я написал 0 вместо 10.

Почему я не получал какой-то ошибки или, по крайней мере, ошибки сегмента, когда пытался писать и читать из этой матрицы?

Кроме того, является ли это правильным способом размещения матрицы в структуре?

Спасибо, что уделили мне время.

 typedef struct G {  int initilized;  char matrix[9][9][0];  } grid;  

Комментарии:

1. Массивы нулевого размера разрешены в некоторых компиляторах в качестве расширения

2. @EugeneSh. Однако удивительно, что они допускают массивы объектов нулевой длины. Конечно char matrix[0][9][10]; , это было бы понятно. GCC поддержал это для реализации гибких элементов массива до того, как они были стандартизированы как char matrix[][9][10] .

3. Что касается «почему нет ошибок при чтении или записи»: запись за пределами массива всегда является неопределенным поведением и никогда не гарантирует ошибку, segfault или что-либо еще предсказуемое. Вероятно, произошло то, что вы в конечном итоге читали/записывали любые данные, которые появлялись в памяти после этого объекта; системе нелегко обнаружить это, не добавляя много дополнительных затрат в вашу программу во время выполнения.

4. @IanAbbott: Это могло бы иметь смысл, если бы размеры были константами, определенными или вычисленными где-то еще. Если один из них окажется равным нулю, может быть удобно, что весь многомерный массив фактически просто опущен.

5. @IanAbbott: Нравится char matrix[9][9][N_WHATSITS]; . Если вы создаете платформу, в которой нет каких-либо функций, это #define N_WHATSITS 0 позволит избежать каких-либо накладных расходов. Проще, чем оборачивать каждую такую строку #if N_WHATSITS gt; 0 . (Предположительно, вы обрабатываете массив с помощью чего-то подобного for (i=0; i lt; N_WHATSITS; i ) { ... } , что становится пустым циклом и будет оптимизировано.)

Ответ №1:

-Wpedantic поднимет тревогу.

 warning: ISO C forbids zero-size array 'matrix' [-Wpedantic]  4 | char matrix[9][9][0];  | ^~~~~~