c 返回变量并释放 malloc 内存

标签 c malloc

我有一个函数,它接受一个 url 并返回请求的文件类型,但我不知道如何释放并返回 malloc'd char*。

const char* lookup(const char* path){
    char* rawEnding;
    char* ending = malloc(strlen(path));
    char* mime = malloc(strlen(path));

    rawEnding = strrchr(path, '.');
    if(strcasecmp(rawEnding, ".css") == 0 || strcasecmp(rawEnding, ".html") == 0 || strcasecmp(rawEnding, ".javascript") == 0 || strcasecmp(rawEnding, ".php") == 0)  {
        memmove(ending, rawEnding+1, strlen(rawEnding));
        sprintf(mime, "text/%s", ending);
        free(ending);
        return mime;
    } else if (strcasecmp(rawEnding, ".gif") == 0 || strcasecmp(rawEnding, ".ico") == 0 || strcasecmp(rawEnding, ".png") == 0) {
        memmove(ending, ending+1, strlen(ending));
        sprintf(mime, "image/%s", ending);
        return mime;
    } else if (strcasecmp(rawEnding, ".jpg") == 0 || strcasecmp(rawEnding, ".jpeg") == 0) {
        return "text/jpeg";
    } else {
        return NULL;
    }
}

最佳答案

如果函数在一种情况下返回字符串文字,而在另一种情况下返回指向动态分配的内存的指针,那么这是一个坏主意。您的函数应始终返回动态分配的内存或NULL。因此您可以释放函数外部的内存。

const char* lookup( const char* path )
{
    char* rawEnding = strrchr( path, '.' );
    if ( rawEnding == NULL )
        return NULL;

    char* ending = rawEnding + 1;
    if ( strcasecmp( ending, "css" ) == 0 ||
         strcasecmp( ending, "html" ) == 0 ||
         strcasecmp( ending, "javascript" ) == 0 ||
         strcasecmp( ending, "php" ) == 0)
    {   
        int len = strlen( "text/" ); 
        char* mime = malloc( len + strlen( ending ) + 1 );
        strcpy( mime, "text/" );
        strcpy( mime + len, ending );
        return mime;
    }
    else if ( strcasecmp( ending, "gif" ) == 0 ||
              strcasecmp( ending, "ico" ) == 0 ||
              strcasecmp( ending, "png" ) == 0)
    {
        int len = strlen( "image/" ); 
        char* mime = malloc( len + strlen( ending ) + 1 );
        strcpy( mime, "image/" );
        strcpy( mime + len, ending );
        return mime;
    }
    else if ( strcasecmp( ending, "jpg" ) == 0 ||
              strcasecmp( ending, "jpeg" ) == 0)
    {
        char* mime = malloc( strlen( "text/jpeg" ) + 1 );
        strcpy( mime, "text/jpeg" );
        return mime;
    }
    return NULL;
}

关于c 返回变量并释放 malloc 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35634037/

相关文章:

c++ - 套接字:使用不带memcpy的recvfrom将UDP数据放入字对齐的缓冲区中?

c - 如何在struct中使用malloc或new?

c - 如果我使用 O_NDELAY,为什么 errno 会设置 EAGAIN?从 dev/tty 读取

C 编程 - 使用 strcat() 导致 valgrind 出错

c - Malloc() 不起作用 + 字符数组清除

c++ - malloc() : memory corruption (fast) c++

c - 使用 char * 和 malloc 数组的 C 程序中的段错误

c - 警告 : passing argument 2 of 'calcFx' makes integer from pointer without a cast

c - C语言中的众数、中位数、平均值、标准差、方差计算器

c - 用A*搜索算法解3x3三维方 block 拼图?