首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getaddrinfo引发分段错误

getaddrinfo引发分段错误
EN

Stack Overflow用户
提问于 2013-11-07 19:25:44
回答 2查看 3.1K关注 0票数 0

所以我花了一段时间才弄清楚,因为“分割错误”没有显示任何代码线,但很明显,这在我的程序中造成了分割错误:

代码语言:javascript
复制
if (getaddrinfo(options.servername, (char *)options.portno, &hints, &ai) < 0) {
    bail_out(EXIT_FAILURE, "Could not recieve server adress\b");
}

变量设置如下

代码语言:javascript
复制
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非常陌生,尤其是指针的东西对我来说还是很奇怪的,所以希望有人能找到一个可能的原因。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-07 19:30:37

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

如果希望getaddrinfo()使用该字符串,则应首先将其转换为字符串:

代码语言:javascript
复制
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");
}
票数 3
EN

Stack Overflow用户

发布于 2013-11-07 19:28:12

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19844860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档