执行以下代码时,我收到分段错误(核心已转储)。
我很难确定为什么会收到此错误。我认为这是一个指针问题。
这是代码
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;
}
最佳答案
将关键评论转化为答案。PORT
的定义是什么? POSIX说getaddrinfo()
有原型
int getaddrinfo(const char *restrict nodename, const char *restrict servname,
const struct addrinfo *restrict hints, struct addrinfo **restrict res);
并且还规定:
nodename
和servname
参数是空指针或指向以空终止的字符串的指针。应用程序应将这两个参数之一或全部作为非空指针提供。操作说明:
端口设置为6667 —
#define PORT 6667
如果您有
#define PORT 6667
,则它看起来不像是空指针或以空终止的字符串。因此,您的代码崩溃对我来说并不奇怪。令人惊讶的是,您没有收到编译器警告,告诉您您做错了。启用警告,或获得更好的编译器。并注意警告-编译器比您更了解C。我很少运行无法干净编译的代码
gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
(
-Werror
确保我处理警告,因为如果有警告,编译会失败!有时我还会添加一些警告;我很少删除其中的任何警告。)