微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不能在一个函数中使用 malloc 两次

如何解决不能在一个函数中使用 malloc 两次

我正在尝试编写一个简单的 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,这意味着您错误地访问了内存。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。