这种C指针的使用是否可以避免泄漏内存?

use*_*232 1 c memory-leaks

char *a() {
    char *t = malloc(8);
    t[0] = 'a'; 
    t[1] = 'b';
    //...
    t[7] = 'h';
    return t;
}

int main(void) {
    char *x = a();
    //do something with x 
    //...
    free(x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个代码是否有任何潜在的问题,因为内存分配a()和使用内存main()

Ed *_* S. 10

首先,a()被声明为返回void,但是您尝试返回char*.更改签名以返回char*.

其次,你的函数很好,但你的示例代码有内存泄漏,因为你永远不会释放返回的指针所指向的内存.

第三,正如gbrandt指出的那样,在调用malloc之后,你没有检查是否成功.malloc可能会失败,并检查它是否是一个良好的习惯进入.


另一种实现此目的的方法是将指针传递给指向()的指针,然后调用者必须在将指针传递给()之前自己创建指针,但无论哪种方式,您仍然需要释放内存.说实话,在这种情况下,我会采用你的方法.没有令人信服的理由这样做,只是想我会提到它.

void a(char **p)
{
    *p = malloc(8);
    if (*p)
    {
        **p[0] = 'a'; 
        **p[1] = 'b';
        ...
        **p[7] = 'h';
    }
}

int main(void)
{
    char *x;
    a(&x);
    //do something with x 
    .....
    free(x);
}
Run Code Online (Sandbox Code Playgroud)

如果这种替代方法让您感到困惑,请告诉我,因为我很乐意提供解释(但是,此刻,我需要重新开始工作!)