Я думаю, что вы, вероятно, захотите прочитать эту статью: «Влияние прерываний в стиле согласования высокой интенсивности на отладку конечного пользователя» , TJ Robertson, Joseph Lawrance и Margaret Burnett, Journal of Visual Languages и вычисление 17 (2), 187-202, апрель 2006 г.
Он задал похожий вопрос. В результате пользователь должен знать, что вы хотите его внимания, а затем бездельничать и ждать, пока пользователь ответит. Не перебивайте пользователя, хотя, это не то, что он или она хочет.
Классический выпуск. Вы можете просто справиться с этим (и обратите внимание, что sizeof (foo) может быть отключено более чем на единицу, если компилятор округляет размер структуры в большую сторону, что (я считаю) разрешено), или вы можете сделать что-то вроде этого:
struct packetheader {
int id;
int filename_len;
};
struct packet {
struct packetheader h;
char filename[1];
};
Это раздражает (нужно использовать h.id и т. Д.), Но работает. Обычно я просто имею дело с этим, но приведенный выше может быть немного более портативным.
Я думаю, вам следует взглянуть на некоторые существующие примеры структур с динамическим размером для руководства здесь. Лучший пример, о котором я знаю, - это TOKEN API в Win32. Они используют макрос ANYSIZE_ARRAY, который просто разрешается до 1. Рэймонд Чен опубликовал в блоге обширную статью, в которой подробно описал, почему они работают таким образом
Что касается таких операций, как сбой sizeof. Это не удастся, независимо от того, какое решение вы выберете для структуры с динамическим размером. sizeof - это операция времени компиляции, и вы будете изменять размер структуры во время выполнения. Это просто не может работать.
Я предлагаю использовать char filename [1]
и включать завершающий 0-байт. Таким образом, вы можете malloc ()
выбрать правильный размер структуры и избежать одноразовых ошибок, подобных этой:
ptr = malloc(sizeof(struct packet)+filename_len);
strncpy(&ptr->filename, filename, filename_len);
Но получатель должен знать, что ему нужно прочитать filename_len + 1
байтов.
Действительно массивы нулевой длины не являются частью стандарта. Но то, что у вас есть во фрагменте кода, - это гибкий массив, который является частью стандарта ISO C99. Если вы можете использовать C99, я бы использовал гибкий массив, если не предложение jesup, вероятно, лучшее.