以下代码是打印原型结构。
除非我getprotoent()
初始化结构变量,否则我将无法打印该结构变量。
如果我不这样做,就结束了细分的步履蹒跚 getprotoent().
有人知道吗?
萨姆
#include <stdio.h>
#include <string.h>
#include <netdb.h>
int
main(){
struct protoent *proto;
memset(&proto,0,sizeof(proto));
proto = getprotoent();
printf("proto.p_name = %s\n",(*proto).p_name);
printf("proto.p_aliases = %s\n",*(*proto).p_aliases);
printf("proto.p_proto = %d\n",(*proto).p_proto);
}
您应该使用:
struct protoent proto;
memset(&proto,0,sizeof(proto));
作为*proto
指向结构的指针,它只能保存struct protoent
类型变量的地址。您的陈述实际上并未初始化结构。
更多说明:
struct protoent *proto;
memset(&proto,0,sizeof(proto));
在某些系统上,这可能与 struct protoent *proto = NULL;
由于您实际上是“将0分配给指针”
之后,您将在printf
语句中取消引用它,这肯定会导致seg错误。
编辑/更新:在评论中由user694733建议
并非所有系统都将地址分配0
给NULL指针。它是对保留的某些地址的转换NULL
,编译时您将保留该地址<datatype> *ptr = 0;
。但是这样做memset(&ptr,0,sizeof(ptr));
会不会被编译器可以理解为NULL assignment
在这些系统上,它会简单地分配地址0
给ptr
它,因为我说可能不是一个NULL
。
要了解更多信息,请阅读此链接或有关指针的完整C-FAQ章节NULL
。
我也想在SO上引用这个相关的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句