分配了 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 正确。
总体问题: 当您将通过 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 正确。