总体问题:当您分配通过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函数中分配的内存,从而导致内存泄漏。