分段错误(核心转储)

时间:2018-10-20 17:20:31

标签: c

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

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

这是代码

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

1 个答案:

答案 0 :(得分: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确保我处理了警告,因为如果有的话编译会失败!有时我还会添加一些警告;我很少删除其中的任何警告。)