分配了 malloc'ed return 值的指针是否也需要 malloc'ed

Does a pointer assigned a malloc'ed return value also need to be malloc'ed

总体问题: 当您将通过 malloc 分配的 return 值分配给指针时,是否需要 malloc 那个指针也是如此,或者你可以简单地声明并分配它吗?

例如,假设我有一个函数 foo,它在执行过程中使用 malloc 创建了一个 char * 并为其赋值。然后函数 return 就是 char *。如果在另一个函数中(示例中的 main)我想设置一个不同的 char * 等于 foo 的结果,我是否也必须 malloc 那个新变量?或者我可以跳过额外的 malloc 调用并保留 foo 中分配的值吗?

char* foo (char *someVal) {
    /* other code happens */

    char *result = malloc((strlen(someVal)+1) * sizeof(char));
    strncpy(result, someVal, strlen(someVal);
    result[strlen(someVal)] = '[=11=]';
    return result;
}

int main (int argc, char **argv) {
    char *s = "xxxx";

    // Version 1: doing malloc first:
    char *manip1 = malloc(25 * sizeof(char));
    manip1 = foo(s);

    //Version 2: skipping malloc and directly assigning:
    char *manip2 = foo(s);

    /* perform some operation on manip */
}

所以看看这个例子,我可以简单地从上面的代码中完成 版本 2,还是我必须做 版本 1?

当您调用 Malloc 时,它会为变量分配内存。在您的示例中,方法 foo 将 return 指向新分配的内存的指针。对于版本 1,您分配的内存将由 manip1 指向。然后您将 manip1 更改为指向 foo 函数中分配的内存,从而导致内存泄漏。

您不必(也不应该)预先分配 space。指针就是指针。它可以指向任何东西,包括它不应该指向的东西(即单元化指针)。

举个例子:假设你指着一所房子。一定要自己有房子才能指别人的吗?你可以指向任何你想要的地方。以类似的方式,在指向别人的

之前,您不必拥有记忆。

在您的示例中,版本 1 会造成内存泄漏,因为您无法再通过任何方式引用最初分配的内存。版本 2 正确。