打印初始化结构

时间:2013-12-20 08:56:46

标签: c sockets

以下代码是打印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);
}

3 个答案:

答案 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,它都会失败。