坦率地说,这样的代码是有效的还是会产生 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;
}
我从不认为它对这样的事情有效,但似乎 SystemV 消息队列正是这样做的:参见手册页。
那么,如果 SysV 消息队列可以做到这一点,也许我也可以做到这一点?我想我会发现这对于通过网络发送数据很有用(因此是__attribute__((__packed__))
)。
或者,也许这是 SysV 消息队列的特定保证,我不应该在其他地方做类似的事情?或者,也许可以使用这种技术,只是我做错了?我想我最好问问。
这- 1
是malloc(sizeof(struct weird_struct) + sizeof(text) - 1)
因为我考虑到无论如何都分配了一个字节,unsigned char value[1]
所以我可以从sizeof(text)
.