首先,让我们来看一下为什么您会收到别名冲突警告。
别名规则简单地说,只允许您通过其自身类型、有符号/无符号变体类型或字符类型(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
类型,这是一种违反别名规则的行为。因为你只有通过(请参见上面的规则摘要!)
char
、
signed char
或
unsigned char
访问
incoming_buf
数组的元素的权利。
请注意,在你的第二个问题中也存在完全相同的别名问题:
*((unsigned int*)dcc->outgoing_buf) = htonl (dcc->file_confirm_offset);
你通过 unsigned int
访问 outgoing_buf
的 char
元素,因此这是一种别名违规。
提出的解决方案
为了解决这个问题,你可以尝试直接定义数组元素的类型来访问:
unsigned int incoming_buf[LIBIRC_DCC_BUFFER_SIZE / sizeof (unsigned int)];
unsigned int outgoing_buf[LIBIRC_DCC_BUFFER_SIZE / sizeof (unsigned int)];
顺便提一下,unsigned int
的宽度是由实现定义的,因此如果您的程序假定unsigned int
是32位,则应考虑使用uint32_t
。
这样,您就可以在数组中存储unsigned int
对象,而不会通过访问char
类型的元素来违反别名规则,例如:
*((char *) outgoing_buf) = expr_of_type_char;
或者
char_lvalue = *((char *) incoming_buf);
编辑:
我已经全面修订了我的回答,特别是解释了程序为什么会收到编译器的别名警告。
char*
。或者我漏掉了什么? - MysticialT2
类型的左值访问T1
类型的对象,并且T2
是char
类型时不存在别名违规问题,但当T1
是char
类型且T2
不是带符号/无符号的char
变量时,就会存在别名违规。 - ouah