不能在函数中两次使用 malloc
Can't use malloc twice in a function
我正在尝试编写一个简单的 HTTP 服务器。
我编写了一个名为“handleConnection
”的简单函数来处理传入连接。
我使用两个 malloc 函数。第一个是接收 GET header,第二个是从 GET header 中提取路径,第二个是导致 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
仅适用于以 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
这意味着你错误地访问了内存。
我正在尝试编写一个简单的 HTTP 服务器。
我编写了一个名为“handleConnection
”的简单函数来处理传入连接。
我使用两个 malloc 函数。第一个是接收 GET header,第二个是从 GET header 中提取路径,第二个是导致 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
仅适用于以 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
这意味着你错误地访问了内存。