当我尝试在字符串末尾添加NUL终结符时,为什么会出现分段错误?

时间:2016-01-07 20:22:55

标签: c

根据GDB,当我尝试将'\0'分配到request_line中的最后一个位置时,我遇到了分段错误。我无法在堆上使用任何内存(allocmalloccalloc),因为这是一个服务器实现,其中包含一些控制处理程序,可能会很难释放空间

request_targetSize的大小为24,这是正确的。

#include <string.h>
#include <stdio.h>

int main()
{
   const char line[80] = "GET /index.html/search?q=cat HTTP/1.1";
   char *abs_path;
   char *str = NULL;
   char *request_target= NULL;
   char *query = NULL;


   //get request target
   char* startofRequest_target = strchr(line, '/');
   char* endofRequest_target = strchr(startofRequest_target, ' ');
   int request_targetSize = endofRequest_target - startofRequest_target;
   if (startofRequest_target != NULL && endofRequest_target != NULL) 
   {
       memcpy(request_target, startofRequest_target, request_targetSize);
       request_target[request_targetSize] = '\0';
   }
....

我的猜测是,它与使用request_target初始化NULL数组有关,但如果我不这样做,我会收到错误。

为什么我会遇到此分段错误?另外,为什么我有时需要将char *变量分配给NULL,有时不需要?

2 个答案:

答案 0 :(得分:4)

我看到的问题是

 memcpy(request_target, startofRequest_target, request_targetSize);

这里,request_target为NULL,你正在尝试写入它。它调用undefined behavior因此出现了seg错误。

不要将request_target作为指针,而应考虑使用数组,例如

char request_target[80]= {0};

答案 1 :(得分:0)

如果您想使用request_target初始化NULL,那么在执行memcpy之前,您应该为其分配一些内存(例如,使用malloc)。

编辑:抱歉,您已经提到过不能使用堆。