【发布时间】:2010-07-28 00:55:44
【问题描述】:
我一直在学习一个关于如何为 Linux 构建基本数据包嗅探器的小教程。我让一切正常,现在我想添加 IP 到主机的映射。
在我添加此功能之前一切正常:
void IPtoHostname(char *ipaddress, char *hostname){
struct hostent *host;
in_addr_t ip = inet_addr(ipaddress);
if (!hostname){
puts("Can't allocate memory...");
exit(-1);
}
host = gethostbyaddr((char *)&ip, 32, AF_INET);
hostname = strdup(host->h_name);
}
这基本上需要一个字符串 IP 地址(“192.168.28.18”)ipaddress 并将该 IP 的主机名(“who.cares.com”)填入 主机名。
发生的事情是 strlen 拒绝 给我任何东西(我知道 strdup 是如何工作的,我自己已经测试过了)和段错误。我用过GDB,字符串以null结尾 字符且不为 NULL。
我还使用带有静态结构的原始字符串分配进行了测试:
void IPtoHostname(char *ipaddress, char *hostname){
static struct hostent *host;
in_addr_t ip = inet_addr(ipaddress);
if (!hostname){
puts("Can't allocate memory...");
exit(-1);
}
host = gethostbyaddr((char *)&ip, 32, AF_INET);
hostname = host->h_name;
}
仍然没有骰子。
那么,strlen 是怎么回事?
【问题讨论】:
-
错误可能在调用此函数的代码中,正如乔治的回答所建议的那样。以后发MCVE
标签: c string segmentation-fault strlen