c - getaddrinfo 抛出段错误

标签 c

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

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 的新手,尤其是指针的东西对我来说还是很陌生,所以希望有人能找到可能的原因。

最佳答案

简单地将整数转换为 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");
}

关于c - getaddrinfo 抛出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19844860/

相关文章:

c - Xlib 和 Firefox 行为

c - 如何仅从 C 中的 scanf 复制前 n 个字符

c - 为什么以及如何运作?

c - 警告 : Control may reach end of non-void function

c - 为什么在 C 中两个 float 的相加是不正确的?

c - 需要帮助将二进制数转换为 C 中的字符串

c - C++ 中的分配相当于 C 中的什么

c - 离散余弦变换DCT实现C

c - 是否可以使用 NSLog C 结构(如 CGRect 或 CGPoint)?

c - 重复调用 C 函数会导致 R - 如何分配内存?