如果我将一个 malloc 变量设置为等于另一个 malloc 变量会发生什么
What happens if I set one malloc variable equal to another malloc variable
我想知道这段代码发生了什么?
在这里,我在 func2
中有一个变量 f2
,它通过 malloc
分配了一个 space 块,在 func1
也通过 malloc
.
分配了一块 space
#include <stdio.h>
#include <stdlib.h>
char* func2(){
char *f2 = (char *)malloc (sizeof(char) * 10);
f2[0] = '1';
f2[1] = '2';
f2[2] = '3';
f2[3] = '[=10=]';
return f2;
}
char* func1(){
char *f1 = (char *)malloc (sizeof(char) * 10);
f1 = func2();
return f1;
}
int main()
{
printf("String: %s", func1());
return 0;
}
现在,由于我在 func2
中分配了堆内存,并且 func1
正在调用它,因此 func1
应该释放该内存。但是我正在将 returned 值分配给 func1
的局部变量 f1
之一,并将 return 该变量分配给主函数 我无法在 func1
.
那么,我将如何释放在 func2
中分配的内存。
func1
中的f1
和func2
中的f2
的堆内存space是否相同?
如果您希望 func1
释放任何东西,它应该调用 free
:
char *
func1(void)
{
char *f1 = malloc (sizeof *f1 * 10);
free(f1);
f1 = func2();
return f1;
}
如果你没有显式释放内存,那么你有内存泄漏,因为用 func2
的结果覆盖 f1
会丢弃 f1
的先前值和你的程序不再知道先前分配的地址的值,因此您将无法释放它。
malloc返回的值之间没有任何关系。考虑:
int x = 5;
x = 7;
5 怎么了?它被丢弃了。 malloc 返回的地址没有什么神奇之处。如果您为 f1
分配不同的值,则先前的值将被丢弃。
当您 malloc
一块内存时,那块内存 会一直保持 直到您在其上显式调用 free
。 malloc
returns 指向该内存块的指针,如果您用指向不同内存块的指针覆盖该指针,它不会删除第一个内存块。您可以像 William Pursell 建议的那样 free
func1
中的旧 f1
,或者您可以不首先分配第二块内存,因为分配更多未使用的内存没有任何作用:
char* func1() {
char* f1 = func2();
return f1;
}
作为旁注,you should never cast the result of malloc.
我想知道这段代码发生了什么?
在这里,我在 func2
中有一个变量 f2
,它通过 malloc
分配了一个 space 块,在 func1
也通过 malloc
.
#include <stdio.h>
#include <stdlib.h>
char* func2(){
char *f2 = (char *)malloc (sizeof(char) * 10);
f2[0] = '1';
f2[1] = '2';
f2[2] = '3';
f2[3] = '[=10=]';
return f2;
}
char* func1(){
char *f1 = (char *)malloc (sizeof(char) * 10);
f1 = func2();
return f1;
}
int main()
{
printf("String: %s", func1());
return 0;
}
现在,由于我在 func2
中分配了堆内存,并且 func1
正在调用它,因此 func1
应该释放该内存。但是我正在将 returned 值分配给 func1
的局部变量 f1
之一,并将 return 该变量分配给主函数 我无法在 func1
.
那么,我将如何释放在 func2
中分配的内存。
func1
中的f1
和func2
中的f2
的堆内存space是否相同?
如果您希望 func1
释放任何东西,它应该调用 free
:
char *
func1(void)
{
char *f1 = malloc (sizeof *f1 * 10);
free(f1);
f1 = func2();
return f1;
}
如果你没有显式释放内存,那么你有内存泄漏,因为用 func2
的结果覆盖 f1
会丢弃 f1
的先前值和你的程序不再知道先前分配的地址的值,因此您将无法释放它。
malloc返回的值之间没有任何关系。考虑:
int x = 5;
x = 7;
5 怎么了?它被丢弃了。 malloc 返回的地址没有什么神奇之处。如果您为 f1
分配不同的值,则先前的值将被丢弃。
当您 malloc
一块内存时,那块内存 会一直保持 直到您在其上显式调用 free
。 malloc
returns 指向该内存块的指针,如果您用指向不同内存块的指针覆盖该指针,它不会删除第一个内存块。您可以像 William Pursell 建议的那样 free
func1
中的旧 f1
,或者您可以不首先分配第二块内存,因为分配更多未使用的内存没有任何作用:
char* func1() {
char* f1 = func2();
return f1;
}
作为旁注,you should never cast the result of malloc.