首先,让我们检查一下为什么会收到混叠违规警告。
别名规则只是说您只能通过对象自己的类型、其有符号/无符号变体类型或通过字符类型 ( char
, signed char
, unsigned char
) 访问对象。
C 说违反别名规则会调用未定义的行为(所以不要!)。
在程序的这一行中:
unsigned int received_size = ntohl (*((unsigned int*)dcc->incoming_buf));
尽管incoming_buf
数组的元素是 类型的char
,但您正在以 . 的形式访问它们unsigned int
。实际上,表达式中取消引用运算符的结果*((unsigned int*)dcc->incoming_buf)
是unsigned int
类型的。
这违反了别名规则,因为您仅有权incoming_buf
通过(参见上面的规则摘要!)访问数组的元素char
,signed char
或unsigned char
。
请注意,您的第二个罪魁祸首中存在完全相同的混叠问题:
*((unsigned int*)dcc->outgoing_buf) = htonl (dcc->file_confirm_offset);
您访问through的char
元素,因此这是一个别名冲突。outgoing_buf
unsigned int
建议的解决方案
要解决您的问题,您可以尝试将数组的元素直接定义为您要访问的类型:
unsigned int incoming_buf[LIBIRC_DCC_BUFFER_SIZE / sizeof (unsigned int)];
unsigned int outgoing_buf[LIBIRC_DCC_BUFFER_SIZE / sizeof (unsigned int)];
(顺便说一下,宽度是实现定义的,所以如果你的程序假设是 32 位unsigned int
,你应该考虑使用)。uint32_t
unsigned int
这样,您可以unsigned int
通过 type 访问元素,在不违反别名规则的情况下将对象存储在数组中char
,如下所示:
*((char *) outgoing_buf) = expr_of_type_char;
或者
char_lvalue = *((char *) incoming_buf);
编辑:
我已经完全修改了我的答案,特别是我解释了为什么程序会从编译器获得别名警告。