C: Рекомендуемый стиль для динамично размерных структур

Я думаю, что вы, вероятно, захотите прочитать эту статью: «Влияние прерываний в стиле согласования высокой интенсивности на отладку конечного пользователя» , TJ Robertson, Joseph Lawrance и Margaret Burnett, Journal of Visual Languages и вычисление 17 (2), 187-202, апрель 2006 г.

Он задал похожий вопрос. В результате пользователь должен знать, что вы хотите его внимания, а затем бездельничать и ждать, пока пользователь ответит. Не перебивайте пользователя, хотя, это не то, что он или она хочет.

9
задан unwind 26 May 2009 в 13:39
поделиться

4 ответа

Классический выпуск. Вы можете просто справиться с этим (и обратите внимание, что sizeof (foo) может быть отключено более чем на единицу, если компилятор округляет размер структуры в большую сторону, что (я считаю) разрешено), или вы можете сделать что-то вроде этого:

struct packetheader {
   int id;
   int filename_len;
};
struct packet {
   struct packetheader h;
   char filename[1];
};

Это раздражает (нужно использовать h.id и т. Д.), Но работает. Обычно я просто имею дело с этим, но приведенный выше может быть немного более портативным.

6
ответ дан 4 December 2019 в 11:08
поделиться

Я думаю, вам следует взглянуть на некоторые существующие примеры структур с динамическим размером для руководства здесь. Лучший пример, о котором я знаю, - это TOKEN API в Win32. Они используют макрос ANYSIZE_ARRAY, который просто разрешается до 1. Рэймонд Чен опубликовал в блоге обширную статью, в которой подробно описал, почему они работают таким образом

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

6
ответ дан 4 December 2019 в 11:08
поделиться

Я предлагаю использовать char filename [1] и включать завершающий 0-байт. Таким образом, вы можете malloc () выбрать правильный размер структуры и избежать одноразовых ошибок, подобных этой:

ptr = malloc(sizeof(struct packet)+filename_len);
strncpy(&ptr->filename, filename, filename_len);

Но получатель должен знать, что ему нужно прочитать filename_len + 1 байтов.

4
ответ дан 4 December 2019 в 11:08
поделиться

Действительно массивы нулевой длины не являются частью стандарта. Но то, что у вас есть во фрагменте кода, - это гибкий массив, который является частью стандарта ISO C99. Если вы можете использовать C99, я бы использовал гибкий массив, если не предложение jesup, вероятно, лучшее.

3
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: