指定malloc&#f返回值的指针是否也需要malloc&ed

时间:2015-10-09 02:49:55

标签: c pointers malloc

总体问题:当您将通过malloc分配的返回值分配给指针时,您是否还需要malloc该指针,或者您可以简单地声明并分配它?

例如,假设我有一个函数foo,它在执行过程中使用char *创建malloc并分配其值。然后该函数返回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)] = '\0';
    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 */
}

所以看一下这个例子,我可以从上面的代码中完成 Version 2 ,还是我必须做 Version 1

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

举例说明:假设你指着一所房子。你必须拥有一所房子指向别人的房子吗?你可以指向任何你想要的地方。以类似的方式,您不必在指向之前拥有内存。

在您的示例中,版本1会创建内存泄漏,因为您无法再引用最初分配的内存。版本2是正确的。