我制作了一个小型客户端/服务器应用程序,但我想知道字段s_addr的默认值是否为INADDR_ANY,因为当我没有为套接字指定地址时,对于客户端和服务器,它的工作方式与结构中给定的此标志相同。我在文件上没有找到关于的任何信息
struct sockaddr_in {
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
};
struct in_addr {
unsigned long s_addr;
};
默认值为"未定义";,即结构的初始状态取决于它在RAM中所占字节的预先存在的状态(这反过来又取决于这些内存位置在程序执行的早期被用于什么)。显然,您不能依赖于这种行为,所以在对任何内容使用结构之前,您应该始终将字段设置为某个适当的已知值。
确保结构的所有字段都设置为全零的一种方便方法是:memset(&myStruct, 0, sizeof(myStruct));
除了Jeremy Friesner的答案外,您还可以使用
结构sockaddr_in addr={0};
一次性声明和初始化结构,这样您就不会忘记将其归零。我相信这在C99之后就有效了;在C23中,您还可以省略0;因此CCD_ 2也将工作。
但我最喜欢的方法是使用指定的初始化程序(自C99以来有效),如下所示:
struct sockaddr_in addr ={
.sin_family = AF_INET,
.sin_addr.s_addr = htonl(INADDR_ANY),
.sin_port = htons(PORT)
};
未显式初始化的字段将为零。
什么是C中指定的初始值设定项?