C、atoi()产生段错误

标签 c segmentation-fault atoi

我使用 atoi() 从 header 获取状态代码,但它不适用于以下输入:

"404 Not Found\r\n内容类型: text/html\r\n日期: 2013 年 12 月 12 日星期四 20:53:22 GMT\r\n连接: 关闭\r\n\r\n “

它不应该在第一个非数字字符处停止读取吗? 如上所述:http://www-control.eng.cam.ac.uk/~pcr20/www.cppreference.com/stdstring_details.html

atoi() will stop reading from str as soon as a non-numerical character has been read

根据调试器,发生段错误的代码:

__NTH (atoi (const char *__nptr))
{
   return (int) strtol (__nptr, (char **) NULL, 10);
}

这是 stdlib.h 中的第 280 行,__nptr 的值为:

__nptr  " 404 Not Found\r\nContent-type: text/html\r\nDate: Thu, 12 Dec 2013 20:53:22 GMT\r\nConnection: close\r\n\r\n" char *
<小时/>

我想指出以下输入工作正常(没有段错误):

__nptr  " 404 Not Found\r\nContent-Type: text/html; charset=UTF-8\r\nX-Content-Type-Options: nosniff\r\nDate: Thu, 12 Dec 2013 21:13:24 GMT\r\nServer: sffe\r\nContent-Length: 943\r\nX-XSS-Protection: 1; mode=block\r\nAlternate-Protocol: 80:quic\r\n\r\n"   char *

__nptr  " 302 Found\r\nCache-Control: no-cache, no-store, must-revalidate\r\nPragma: no-cache\r\nExpires: 0\r\nLocation: http://br.godaddy.com/\r\nServer: Microsoft-IIS/7.0\r\nSet-Cookie: MemBotChk=false; path=/\r\nSet-Cookie: countrysite1=www; domain=godaddy.com; expires=Fri, 12-Dec-2014 21:15:09 GMT; path=/\r\nSet-Cookie: language1=pt-BR; domain=godaddy.com; expires=Fri, 12-Dec-2014 21:15:09 GMT; path=/\r\nP3P: policyref="/w3c/p3p.xml", CP="COM CNT DEM FIN GOV INT NAV ONL PHY PRE PUR STA UNI IDC CAO OTI DSP COR C..."    char *
<小时/>

实际上,除了我一开始提到的输入之外,到目前为止所有输入都工作正常。 什么可能导致段错误?

删除前导空格没有什么区别。我还尝试在响应代码后添加一个空终止符,同样的事情发生了。所以我相信这不是atoi(),而是其他东西。如何识别问题?

<小时/>

Valgrind 结果:

main.c:23 中 main 中大小 1​​ 的读取无效

地址 0xf 未堆栈、分配或(最近)释放

  • 1:__strtol_l_internal 在 /build/eglibc-hkB3nk/eglibc-2.17/stdlib/../stdlib/strtol_l.c:298
  • 2: /usr/include/stdlib.h:280 中的 get_web_content
  • 3: main.c:23 中的 main

main.c:23 只是对 get_web_content() 的调用

<小时/>

问题是稍后使用空指针调用atoi()。

最佳答案

这确实是初学者的错误。为了为响应正文分配内存,我调用了 strcasestr 来查找 Content-Length: 字段。只是我没有检查该字段是否已找到。我不明白的是为什么调试器显示先前对 atoi() 的调用。

如果有同样问题的人偶然发现这个问题,这就是我做错的地方:

fill_this->content_length = atoi(strcasestr(header_string + i, "Content-Length:") + 15);   

解决方案:

char *temp = strcasestr(header_string + i, "Content-Length:");
if(temp == NULL)
   return;
fill_this->content_length = atoi(temp + 15);

关于C、atoi()产生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20554795/

相关文章:

c++ - 我不明白为什么 map 会导致段错误

c - 如何在C中从这种类型的字符串中获取数字

c - unsigned int 的内存分配(calloc、malloc)

c - 如何声明全局结构数组并在不同的函数中使用它?

c - C 中的空闲内存(无法修复内存泄漏)

c - 为什么编译器在包含标准库中的头文件时不需要传递相应的源文件?

bash - 如何在 Fortran 90 程序中抑制由于 SIGSEGV 或 SIGFPE 引起的输出?

c++ - MPI_Send/Recv C++ std::string 段错误

c - 尝试用二进制值填充数组并确定最低有效位

c - 为什么 ATOI 在此代码中返回 0?