根据GDB,当我尝试将'\0'
分配到request_line
中的最后一个位置时,我遇到了分段错误。我无法在堆上使用任何内存(alloc
,malloc
,calloc
),因为这是一个服务器实现,其中包含一些控制处理程序,可能会很难释放空间
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
,有时不需要?
答案 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
)。
编辑:抱歉,您已经提到过不能使用堆。