c语言 - 不能在一个函数中使用两次 malloc



我正在尝试编写一个简单的HTTP服务器。我编写了一个名为"handleConnection"的简单函数来处理传入连接。我使用了两个malloc函数。第一种方法是接收GET头,第二种方法是从GET头中提取路径,第二个方法导致malloc(): corrupted top sizenAborted错误。这是代码:

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("%sn", 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只适用于以null结尾的字符串,并且您从未尝试过将getHeader变成以null开头的字符串。

你可能已经知道了,但这是一个常见的初学者错误:除非另有说明,否则电脑会按照你告诉它的顺序做事。它不会同时做所有的事情。它不会回头重做它已经做过的事情(除非你告诉它(。如果执行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,这意味着您错误地访问了内存。

相关内容

  • 没有找到相关文章

最新更新