问题描述
我正在尝试编写一个简单的 HTTP 服务器。
我编写了一个名为“handleConnection
”的简单函数来处理传入连接。
我使用了两个 malloc 函数。第一个是接收 GET 标头,第二个是从 GET 标头中提取路径,第二个导致 malloc(): corrupted top size\nAborted
错误。
代码如下:
int handleConnection(int sockfd)
{
struct sockaddr_in client;
socklen_t clientLength = sizeof(struct sockaddr_in);
int new_sockfd;
new_sockfd = accept(sockfd,(struct sockaddr*)&client,&clientLength);
// receive get header
int getHeaderSize = 0;
char *getHeader = malloc(getHeaderSize);
char tempBuffer;
// stop receiving while loop when matchedTerminators is equal to 2
int matchedTerminators = 0;
char terminators[2] = {'\r','\n'};
// receiving while loop
while(matchedTerminators != 2)
{
recv(new_sockfd,(void *)&tempBuffer,1,0);
if(tempBuffer == terminators[0] || tempBuffer == terminators[1])
matchedTerminators++;
else
{
matchedTerminators = 0;
getHeaderSize++;
strcat(getHeader,&tempBuffer);
}
}
// If already received the get header
printf("%s\n",getHeader);
// extract the path(/) from get header
int pathSize = 0; // this value might increase later
char* path = malloc(pathSize); // when pathSize is increaced this malloc function cause error
/*
Code to extract the path from get header
*/
// free malloc
free(path);
free(getHeader);
return 0;
}
解决方法
这里分配了 0 字节的内存:
int getHeaderSize = 0;
char *getHeader = malloc(getHeaderSize);
在这里,您尝试将一个字节的数据存储在您分配的 0 字节中:
strcat(getHeader,&tempBuffer);
奖励:strcat
仅适用于以空字符结尾的字符串,并且您从未尝试将 getHeader 变成以空字符结尾的字符串。
您可能已经知道这一点,但这是一个常见的初学者错误:除非另有说明,否则计算机会按照您告诉它的顺序执行操作。它不会一次完成所有的事情。它不会返回并重做它已经做过的事情(除非你告诉它)。如果您执行 malloc(getHeaderSize)
并且 getHeaderSize
为 0,则它分配 0 字节的内存。如果之后将 getHeaderSize
更改为 100,您仍然分配了 0 字节的内存,因为计算机不会进行时间旅行。
int getHeaderSize = 0;
char *getHeader = malloc(getHeaderSize);
// ...
int pathSize = 0;
char* path = malloc(pathSize);
两个 molloc
调用为 0 字节分配内存,因此当您尝试访问某个值(例如 path[0]
)时,它必须超出内存范围。您将收到错误 malloc(): corrupted top size
,这意味着您错误地访问了内存。