0

所以我花了一段时间才弄清楚,因为“分段错误”没有显示任何代码行,但显然这导致了我的程序中的分段错误:

if (getaddrinfo(options.servername, (char *)options.portno, &hints, &ai) < 0) {
    bail_out(EXIT_FAILURE, "Could not recieve server adress\b");
}

变量设置如下

struct opts {
    long int portno;
    char *servername;
};

struct opts options;
parse_args(argc, argv, &options);

// Create Socket
struct addrinfo hints;
struct addrinfo *ai, *aip;

hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP; 

我对 C 很陌生,尤其是指针的东西对我来说仍然很陌生,所以希望有人能找到可能的原因。

4

2 回答 2

3

简单地将整数转换为char *不会将其转换为字符串。相反,它会导致该整数的值被解释为内存地址。换句话说,您正在尝试使用您的端口号作为内存地址。

如果要getaddrinfo()使用它,应先将其转换为字符串:

char port[16];
snprintf(port, sizeof(port), "%ld", options.portno);
if (getaddrinfo(options.servername, port, &hints, &ai) < 0) {
    bail_out(EXIT_FAILURE, "Could not recieve server adress\b");
}
于 2013-11-07T19:30:37.377 回答
1

您可能想memset hints使用 0 并尝试一下。memset(&hints, 0, sizeof(hints));

hints包含一些内部可能试图取消引用的指针成员。

于 2013-11-07T19:28:12.020 回答