#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]; | ^~~~~~