我目前正在开发一台服务器,这是我类(class)要求的一部分。规范要求我解析请求行并将适当的数据存储为绝对路径 (abs_path) 和查询。
这是我的代码:
bool parse(const char* line, char* abs_path, char* query)
{ int 空间 = 0;
if (strchr(line, '"') != NULL)
{
error(400);
return false;
}
for (int i = 0; line[i] != '\0'; i++)
{
if (line[i] == ' ')
{
space++;
}
}
if (space != 2)
{
error(400);
return false;
}
if (strncmp("GET ", line, 4) != 0)
{
error(405);
return false;
}
line = strchr(line, ' ');
line++;
if (strncmp("/", line, 1) != 0)
{
error(501);
return false;
}
int j = 0;
int k = 4;
while (line[k] != ' ')
{
int m = k;
abs_path[j] = line[k];
j++;
if (line[k+1] == '?')
{
abs_path[j] = '\0';
int l = 0;
m = k+2;
while (line[m] != ' ')
{
query[l] = line[m];
l++;
m++;
}
if (line[m] == ' ' && l == 0)
{
query[0] = '\0';
}
}
k = m;
k++;
if (line[k] == ' ')
{
abs_path[j] = '\0';
break;
}
}
char* last = strrchr(line, ' ');
last++;
if (strcmp("HTTP/1.1", last) != 0)
{
error(505);
return false;
}
free(abs_path);
return true;
}
我一直遇到这样的段错误。经过一些调试后,我发现如果我在第 20 行将 abs_path 声明为数组而不是指针,则可以消除段错误。但是,我有必要将abs_path声明为指针,所以我需要另一个解决方案。有人可以向我解释一下我在字符串及其处理方面到底做错了什么吗?
由于个人原因,我对此很生疏,所以如果我误解了一些基本的东西,请原谅我。
提前谢谢您!
最佳答案
您需要为 char* 分配内存。数组在编译时自动执行此操作。尝试使用 malloc。
char* abs_path = 0;
abs_path = (char*)malloc(256);
本质上,malloc 执行操作系统调用以从堆中保留顺序内存。 malloc 的参数是要保留多少字节。因此,您应该注意,上面的示例使 abs_path char* 能够指向最多 255 个字符的字符串(为空字符“\0”留下 1 个字节)。不要让您的代码写入超过 255 个字符,否则您将覆盖内存中的其他数据,这就是您之前收到段错误的原因。
正如其他人指出的,您绝对应该释放使用 malloc 动态保留的内存。
free(abs_path);
关于html - C 语言的服务器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594375/