总体问题:当您将通过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 ?
答案 0 :(得分:1)
当您调用Malloc时,它会为变量分配内存。在您的示例中,方法foo将返回指向新分配的内存的指针。使用版本1,您将分配将由manip1指向的内存。然后,您正在将manip1更改为指向foo funation中分配的内存,从而导致内存泄漏。
答案 1 :(得分:1)
您不必事先(也不应该)预先分配空间。指针就是指针。它可以指向任何东西,包括它不应该的东西(即单元化指针)。
举例说明:假设你指着一所房子。你必须拥有一所房子指向别人的房子吗?你可以指向任何你想要的地方。以类似的方式,您不必在指向之前拥有内存。
在您的示例中,版本1会创建内存泄漏,因为您无法再引用最初分配的内存。版本2是正确的。