执行以下代码时,我收到分段错误(核心已转储)。

我很难确定为什么会收到此错误。我认为这是一个指针问题。

这是代码

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);



并且还规定:


  nodenameservname参数是空指针或指向以空终止的字符串的指针。应用程序应将这两个参数之一或全部作为非空指针提供。


操作说明:


端口设置为6667 — #define PORT 6667


如果您有#define PORT 6667,则它看起来不像是空指针或以空终止的字符串。因此,您的代码崩溃对我来说并不奇怪。

令人惊讶的是,您没有收到编译器警告,告诉您您做错了。启用警告,或获得更好的编译器。并注意警告-编译器比您更了解C。我很少运行无法干净编译的代码

gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …


-Werror确保我处理警告,因为如果有警告,编译会失败!有时我还会添加一些警告;我很少删除其中的任何警告。)

08-17 15:13