gpt4 book ai didi

c - gethostbyname 的第二次调用给出段错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:57:15 27 4
gpt4 key购买 nike

这段代码第一次进入循环时运行完美,第二次给出 get seg 错误,如果我运行程序..退出..再次运行,它运行完美也是

if ((server=gethostbyname(HOSTA))==NULL){
fprintf(stderr,"\n\tRESOLVE SERVER FAIL\n\n");
exit(3);
}

gdb 中的 bt 给出

Program received signal SIGABRT, Aborted.
0x0012d422 in __kernel_vsyscall ()
(gdb) bt
#0 0x0012d422 in __kernel_vsyscall ()
#1 0x00197681 in raise () from /lib/tls/i686/cmov/libc.so.6
#2 0x0019aab2 in abort () from /lib/tls/i686/cmov/libc.so.6
#3 0x001d124d in ?? () from /lib/tls/i686/cmov/libc.so.6
#4 0x001db341 in ?? () from /lib/tls/i686/cmov/libc.so.6
#5 0x001dcb98 in ?? () from /lib/tls/i686/cmov/libc.so.6
#6 0x001dfc7d in free () from /lib/tls/i686/cmov/libc.so.6
#7 0x001cb85a in fclose () from /lib/tls/i686/cmov/libc.so.6
#8 0x002d0734 in ?? () from /lib/tls/i686/cmov/libnss_files.so.2
#9 0x002d1b9f in _nss_files_gethostbyname_r () from /lib/tls/i686/cmov/libnss_files.so.2
#10 0x002577de in gethostbyname_r () from /lib/tls/i686/cmov/libc.so.6
#11 0x00257036 in gethostbyname () from /lib/tls/i686/cmov/libc.so.6
#12 0x0804a00c in update () at main.h:144
#13 0x0804b247 in main (argc=1, argv=0xbffff4a4) at main.c:78
(gdb) q

注意:作为调试器我是菜鸟

我的解释是,我不是在 struct hostent 或 gethostbyname 本身的返回上free

代码:@pastebin

我做错了什么?

编辑:函数 update() 进入循环

最佳答案

我也不能指出确切的问题,但函数中肯定有一些错误。我注意到了这一点:

  char *stringA;
....
if((stringA=malloc(BUFSIZEE))==NULL){
printf("\n\tMEMORY ERROR\n\n");
exit(1);
}
stringA=build_get_query(HOSTA,page);
if((write(sockfd,stringA,strlen(stringA)))<0){
printf("\n\tERROR ON SEND\n\n");
}

当 build_get_query 返回某个其他地址(大概)时,您正在丢失存储在 stringA 中的指针(由 malloc 返回)。根据返回数据的大小和分配方法,如果 a) 未动态分配 b) 在其他地方释放 c) 大小与 BUFSIZE 不同(你 memset stringA 多次并将其用作 BUFSIZE 缓冲区),则可以出现段错误.

编辑: 澄清一下,“字符串”,即字符数组,不能通过赋值在 C 中复制。函数可以返回一个指针,但返回值不能填满malloced区域。

关于c - gethostbyname 的第二次调用给出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16359687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com