Tag: 类型 双关语

传递给C函数的指针值不正确

我有一个错误,其中一个不正确的值作为参数传递给C程序中的函数。 它的工作方式是,我将一个指向typedef-ed数据结构的静态指针声明为全局变量。 有一个初始化函数,其中初始化了该变量。 此函数分配内存,初始化数据字段并返回指针。 像这样的东西: static my_type *my_ptr; … void init(void){ my_ptr = init_my_type(); } 函数init_my_type非常简单: void *init_my_type(void){ my_type *x = malloc(sizeof(my_type); x->arg1 = 0; … // more field initializations return x; } 后来我使用my_ptr作为另一个函数的参数: void do_stuff(void){ func(my_ptr); } 我遇到的问题是,当访问my_ptr指向的数据结构中的某些数据时,我会在func中my_ptr 。 当我运行调试器时,当我在init_my_type上中断时,我得到一个漂亮的hex值: (gdb) finish Value returned is $26 (void *) 0x79b6c0 稍后,在do_stuff函数中, my_ptr具有相同的hex值: (gdb) print my_ptr […]

为什么POSIX与ISO C标准相矛盾

见http://pubs.opengroup.org/onlinepubs/009696699/basedefs/sys/socket.h.html ( http://pubs.opengroup.org/onlinepubs/9699919799来自第7期 – 从2013年开始,仍然是相同的!) sockaddr_storage应该转换为其他结构类型,但据我所知,这与ANSI和ISO C标准别名规则相矛盾。 (可以通过指向不兼容类型的指针访问对象,但可以通过3个char类型访问任何内容,并且结构及其第一个成员可以互换。) 我知道在C标准化之前很久就存在使用套接字的做法,但POSIX应该符合ISO C,实际上它与其手册中的标准相矛盾。 (即使在较新版本的POSIX中。) 他们为什么一开始就这样做? 他们为什么不改变它?

修复取消引用类型惩罚指针将破坏严格别名

我正在尝试使用GCC编译特定程序时修复两个警告。 警告是: 警告:解除引用类型惩罚指针将破坏严格别名规则[-Wstrict-aliasing] 而这两个罪魁祸首是: unsigned int received_size = ntohl (*((unsigned int*)dcc->incoming_buf)); 和 *((unsigned int*)dcc->outgoing_buf) = htonl (dcc->file_confirm_offset); incoming_buf和outgoing_buf定义如下: char incoming_buf[LIBIRC_DCC_BUFFER_SIZE]; char outgoing_buf[LIBIRC_DCC_BUFFER_SIZE]; 这似乎与我一直在研究的那个警告的其他例子略有不同。 我宁愿修复问题而不是禁用严格别名检查。 有很多建议要使用联合 – 这个案例可能是一个合适的联合体?