以下代码是打印protoent结构。
除非我getprotoent()
,否则我无法打印结构变量,尽管我将其初始化。
如果我不getprotoent().
有谁知道这个?
Samle.c
#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);
}
答案 0 :(得分:3)
您应该使用:
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
可能不是NULL
}}
要获得更多理解,请阅读this link或关于{{1}}指针的完整C-FAQ chapter。
我还想在SO上引用this related answer。
答案 1 :(得分:2)
对memset
的调用与您
proto = 0; // Which is not neccessarily the same as NULL.
它不分配内存,只是初始化指针。
如果要对指针进行去除,则必须为其分配一些有效的内存,显然getprotoent()
正在分配。取消引用NULL指针会导致程序中止,这是正确的。
答案 2 :(得分:1)
你在做什么
//this defines pointer variable
struct protoent *proto;
//this does not allocate memory for the pointer variable
memset(&proto,0,sizeof(proto));
因此,无论何时取消引用它而不分配它或调用getprotoent
,它都会失败。