当我执行以下代码时,我收到了分段错误(核心已转储)。
我很难确定为什么会收到此错误。我认为这是一个指针问题。
这是代码
struct info{
char *host;
char *channel;
char *user;
}Ainfo;
int main(int argc, char *argv[])
{
struct addrinfo hints;
struct addrinfo *result, *result2;
int sock,getadd;
Ainfo.host=argv[2];
if(argc<3)
{
perror("too few Arguments\n");
exit(0);
}
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = 0;
hints.ai_protocol = 0;
getadd=getaddrinfo(Ainfo.host,PORT,(struct addrinfo *)&hints,&result);
if(getadd!=0){
perror("\n");
exit(0);
}
return 0;
}
答案 0 :(得分:0)
将主要评论转移到答案中。
PORT
的定义是什么? POSIX说getaddrinfo()
有原型
int getaddrinfo(const char *restrict nodename, const char *restrict servname, const struct addrinfo *restrict hints, struct addrinfo **restrict res);
并规定:
nodename
和servname
参数是空指针或指向以空终止的字符串的指针。应用程序应将这两个参数中的一个或两个作为非空指针提供。
操作说明:
#define PORT 6667
如果您有#define PORT 6667
,则它看起来不像是空指针或以空终止的字符串。因此,您的代码崩溃对我来说并不奇怪。
令人惊讶的是,您没有收到编译器警告,告诉您您做错了。启用警告,或获得更好的编译器。并注意警告-编译器比您更了解C。我很少运行无法完全编译的代码
gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
(-Werror
确保我处理了警告,因为如果有的话编译会失败!有时我还会添加一些警告;我很少删除其中的任何警告。)