C语言链表成员和地址输出的疑问
发布网友
发布时间:2024-03-19 07:39
我来回答
共1个回答
热心网友
时间:2024-06-21 23:49
这个是MSVC编译器处理结构体问题
*head是什么? *head的数据类型是struct MyStruct吧,将结构体以%d格式输出,有点逻辑错误吧。
对于这种将结构体(不是结构体指针)放到参数里面的方式,不同的编译器处理的方法不一样,msvc会把结构体的所有内容(包括类型大小对齐的无意义的字节)都放进去,也就是说,
*head:1 head->num:-858992567 (*p).num:3734056显示的都是 *head的内容,后面传的head->num, (*p).num 并未使用
你可以尝试添加如下两行测试代码:
printf("*head: head->num:%d head->na:%c thead->next:%d\n", *head);
printf("head->: head->num:%d head->na:%c thead->next:%d\n", head->num, head->na, head->next);
然而,在GCC类编译器上,会把*head看成一个整体,你的代码在GCC编译器可以输出正常结果,而上面的测试代码则不能正常通过编译。
需要注意的是,printf只是从*head中取固定的字节数(32位程序一般是4字节),为保证避免歧义,不要使用*head方式输出结构体,因为这本来从逻辑上就是有问题的。