C空指针检查在ai_下一个链表中失败

C空指针检查在ai_下一个链表中失败,c,pointers,getaddrinfo,C,Pointers,Getaddrinfo,背景:我将介绍如何使用C套接字侦听和接受传入连接 问题:我遇到的问题是在遍历要侦听的地址链接列表时出现分段错误。我会检查下一个结构是否为null,但这不起作用 我尝试的内容:在这段代码和我之前编写的工作示例之间,我只能分辨出一个区别,即这些地址是我自己的计算机上的地址,而不是另一台主机上的地址。我也查看了getaddrinfo的手册页,并且尽可能地遵循示例实现 #包括 #包括 #包括 #包括 #包括 #包括 #定义MYPORT“6161” int main(){ 结构addrinfo提示,*re

背景:我将介绍如何使用C套接字侦听和接受传入连接

问题:我遇到的问题是在遍历要侦听的地址链接列表时出现分段错误。我会检查下一个结构是否为null,但这不起作用

我尝试的内容:在这段代码和我之前编写的工作示例之间,我只能分辨出一个区别,即这些地址是我自己的计算机上的地址,而不是另一台主机上的地址。我也查看了getaddrinfo的手册页,并且尽可能地遵循示例实现

#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_family=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}

我发现了问题

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>

#define MYPORT "6161"

int main() {
    struct addrinfo hints, *res;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_family = AI_PASSIVE;

    getaddrinfo(NULL, MYPORT, &hints, &res);

    struct addrinfo *addr;
    for (addr = res; addr != NULL; addr = addr->ai_next) {
        printf("Here's one addr!");
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_family=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}
这是你的密码

这是正确的代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>

#define MYPORT "6161"

int main() {
    struct addrinfo hints, *res;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    getaddrinfo(NULL, MYPORT, &hints, &res);

    struct addrinfo *addr;
    for (addr = res; addr != NULL; addr = addr->ai_next) {
        printf("Here's one addr!");
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_flags=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}
您只编写了两次
ai_family
,从而将
ai_PASSIVE
分配给
hints.ai_family
而不是
hints.ai_flags


我尝试了更正后的代码,效果很好。

我发现了问题

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>

#define MYPORT "6161"

int main() {
    struct addrinfo hints, *res;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_family = AI_PASSIVE;

    getaddrinfo(NULL, MYPORT, &hints, &res);

    struct addrinfo *addr;
    for (addr = res; addr != NULL; addr = addr->ai_next) {
        printf("Here's one addr!");
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_family=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}
这是你的密码

这是正确的代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>

#define MYPORT "6161"

int main() {
    struct addrinfo hints, *res;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    getaddrinfo(NULL, MYPORT, &hints, &res);

    struct addrinfo *addr;
    for (addr = res; addr != NULL; addr = addr->ai_next) {
        printf("Here's one addr!");
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYPORT“6161”
int main(){
结构addrinfo提示,*res;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_flags=ai_被动;
getaddrinfo(NULL、MYPORT、提示和res);
结构addrinfo*addr;
for(addr=res;addr!=NULL;addr=addr->ai_next){
printf(“这里有一个地址!”);
}
返回0;
}
您只编写了两次
ai_family
,从而将
ai_PASSIVE
分配给
hints.ai_family
而不是
hints.ai_flags


我尝试了更正后的代码,效果很好。

我第一眼想到的唯一一件事是
getaddrinfo
可能会失败(我不知道为什么),因此不会更改
res
。请检查
getaddrinfo
的返回值,以及调用
getaddrinfo
后res是否发生变化?编辑:我是对的:执行代码会出现以下错误:*不支持ai_系列(我使用gai_strerror进行检查)。我正在调查它…我假设在发生错误的情况下,
getaddrinfo
不会触及
res
poiner。在调用之前,您需要自己将其初始化为
NULL
,或者您需要注意返回值(您应该始终这样做!)。我建议使用
int err=getaddrinfo(NULL、MYPORT、提示和res),然后是
if(err==0)。。。else fprintf(标准,“%s\n”,ai_strerror(err))
我第一眼想到的唯一一件事是
getaddrinfo
可能会失败(但我不知道为什么),因此不会改变
res
。请检查
getaddrinfo
的返回值,以及调用
getaddrinfo
后res是否发生变化?编辑:我是对的:执行代码会出现以下错误:*不支持ai_系列(我使用gai_strerror进行检查)。我正在调查它…我假设在发生错误的情况下,
getaddrinfo
不会触及
res
poiner。在调用之前,您需要自己将其初始化为
NULL
,或者您需要注意返回值(您应该始终这样做!)。我建议使用
int err=getaddrinfo(NULL、MYPORT、提示和res),然后是
if(err==0)。。。else fprintf(标准,“%s\n”,ai_strerror(err))