这种细分错误的原因是什么?

| 它并不总是发生,但是会在服务器应用程序运行了一段时间后发生。 原因是什么,我该如何解决? 代码如下:
struct hostent*     Host;
Result->sin_family=AF_INET;
Result->sin_port=htons((unsigned short)Port);

Host=gethostbyname(HostName);

if(!Host)
{
    unsigned long int addr=inet_addr(HostName);
    if(addr!=-1)
        Host=gethostbyaddr(&addr,sizeof(addr),AF_INET);

    if(!Host)
    {
        if(errno!=ETIMEDOUT)
            errno=-1; /* use h_errno */
        printf(\"Unknown host for server [%s].\", HostName);
        return(0);
    }
}

memcpy((char*)&Result->sin_addr,(char*)Host->h_addr,sizeof(Result->sin_addr));
核心转储:
#0  0x0000000000401913 in proxy_getaddr (HostName=0x7ae30be0 \"stackoverflow.com\", Port=80, Result=0x7ae30bd0) at proxy.c:529

529     memcpy((char*)&Result->sin_addr,(char*)Host->h_addr,sizeof(Result->sin_addr));
(gdb) p *Host
$4 = {h_name = 0xc4ee048 \"\", h_aliases = 0xc4ee030, h_addrtype = 2, h_length = 4, h_addr_list = 0xc4ee038}
(gdb) print Result 
$5 = (struct sockaddr_in *) 0x7ae30bd0
(gdb) print *Result 
$6 = {sin_family = 2, sin_port = 20480, sin_addr = {s_addr = 0}, sin_zero = \"\\000\\000\\000\\000\\000\\000\\000\"}



(gdb) p Host->h_addr_list[0]
$1 = 0x0
(gdb) p Host->h_addr_list
$2 = (char **) 0x1bd9d050
    
已邀请:
假设Host和Result变量都指向合法的内存块,则最可能的原因是
Host->h_addr
NULL
。如果
gethostbyname()
或ѭ5addresses返回的地址列表为空,则将是这种情况。 我不知道这是怎么造成的(OS X系统上的文档暗示,如果找不到地址,则两个函数都应返回NULL)。但是,我将在调试器中检查ѭ6进行确认。 编辑 调试信息的更新显示了问题所在:“ 2”为NULL。 h_addr实际上是这样的#define:
#define h_addr h_addr_list[0]
函数之一是返回带有空地址列表的ѭ9。     
也许源存储区和目标存储区重叠?即
&Result->sin_addr >= Host->h_addr >= &Result->sin_addr + sizeof(Result->sin_addr)
    
memcpy失败。 这可能是由于   (1)sin_addr和h_addr的大小不同或   (2)sin_addr是一个指针,您没有为它分配内存。 请提供Result的定义和初始化以获取更多信息。     

要回复问题请先登录注册