c - 打印初始化结构

标签 c sockets

下面的代码是打印原型(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在这些系统上,它将简单地分配地址 0ptr正如我所说,这可能不是 NULL .

更多理解,请阅读this link或完整的 C-FAQ chapter关于NULL指针。

我还想引用this related answer在 SO 上。

关于c - 打印初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20699721/

相关文章:

c - 使用 GDB 更改 for 循环条件?

c++ - 如何找出套接字在C++中有数据

c++ - CSocket::Send 是否存在性能问题?

java - 网络中的端口是什么?

c - 读取C语言文本文件

C 预处理器 - 无需多重解析即可连接字符串

c - C 中无符号 char 1 的补码

c - 缓冲区溢出时的段错误

c++ - Windows 套接字错误 10013

linux - 终端中未显示某些 TCP 状态