在C中返回char *时如何避免内存泄漏?

问题描述 投票:0回答:1

我有一个类似 C 语言的代码库,其中有一个需要返回 char * 的函数。有没有办法修改此代码,以便我可以返回 char * 而不会像这里一样导致内存泄漏? Glib 已经是一个依赖项,所以我也可以使用 Glib 函数。我知道代码很糟糕,它是由具有物理学位的人而不是工程师编写的。

char *func(int val) {
    char *name = malloc(300);
    if (!name) return NULL;

    switch(value) {
    case 0: 
        {
            name = "dog";
        }
        break;
   
    case 1:
        {
            name = "cat";
        }
        break;
  
    case 2:
        {
            name = "elephant";
        }
        break;

    default: 
        name = "wrong entry";
        return name;
    }

    return name;
}
c memory-leaks malloc glib
1个回答
0
投票

您的代码显示了对字符串的非常基本的误解。您已为 300 个

char
值动态分配了一块内存。从
malloc
返回的不是动态分配的数组,而是指向该动态分配的数组中第一个元素的指针。

当您分配给指针变量时,它不再指向动态分配的内存块,而是指向字符串文字。您不再有任何方法可以返回动态分配的内存。您无法释放它,因此它被泄露了。

您可以使用

strcpy

(或 
strncpy
)将字符串值正确复制到该内存中。

char *func(int val) { char *name = malloc(300); if (!name) return NULL; switch(value) { case 0: strcpy(name, "dog"); break; case 1: strcpy(name, "cat"); break; case 2: strcpy(name, "elephant"); break; default: strcpy(name, "wrong entry"); } return name; }
    
© www.soinside.com 2019 - 2024. All rights reserved.