Честно говоря, такой код действителен или он создает UB?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct __attribute__((__packed__)) weird_struct
{
int some;
unsigned char value[1];
};
int main(void)
{
unsigned char text[] = "Allie has a cat";
struct weird_struct *ws =
malloc(sizeof(struct weird_struct) + sizeof(text) - 1);
ws->some = 5;
strcpy(ws->value, text);
printf("some = %d, value = %s\n", ws->some, ws->value);
free(ws);
return 0;
}
Id никогда не думает, что это действительно так, но кажется, что очереди сообщений SystemV делают именно это: см. справочную страницу.
Итак, если очереди SysV msg могут это сделать, возможно, я тоже смогу это сделать? Я думаю, что Id нахожу это полезным для отправки данных по сети (следовательно, __attribute__((__packed__))
).
Или, возможно, это определенная гарантия очередей SysV msg, и я не должен делать что-то подобное в другом месте? Или, возможно, эту технику можно использовать, только я делаю это неправильно? Я понял, что Id лучше спросить.
Этот - 1
в malloc(sizeof(struct weird_struct) + sizeof(text) - 1)
заключается в том, что я принимаю во внимание, что один байт распределен так или иначе благодаря unsigned char value[1]
, поэтому я могу вычесть его из sizeof(text)
.