下面的代码是打印原型(prototype)结构
除非我执行getprotoent()
,否则我无法打印结构变量,尽管我已经对其进行了初始化。
如果我不 getprotoent() ,它会终止分割。
有人知道吗?
示例.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);
}
最佳答案
你应该使用:
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
中取消引用它声明,这肯定会导致段错误。
编辑/更新:由 user694733 建议在评论中
并非所有系统都分配地址0
到 NULL 指针。它是对某些保留为 NULL
的地址的翻译当你执行 <datatype> *ptr = 0;
时由编译器完成.但是做 memset(&ptr,0,sizeof(ptr));
编译器不会将其理解为 NULL assignment
在这些系统上,它将简单地分配地址 0
至 ptr
正如我所说,这可能不是 NULL
.
更多理解,请阅读this link或完整的 C-FAQ chapter关于NULL
指针。
我还想引用this related answer在 SO 上。
关于c - 打印初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20699721/