c语言 - 分配了错误化返回值的指针是否也需要被错误化



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

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

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

举个例子:假设你指着一座房子。你一定要有自己的房子才能指别人的吗?你可以指着任何你想要的地方。同样,在指向别人的之前,您不必先拥有自己的内存。

在您的示例中,版本1创建了内存泄漏,因为您不再有任何方法来引用您最初分配的内存。版本2是正确的

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

相关内容

  • 没有找到相关文章

最新更新