#include<stdio.h>
#include<stdlib.h>
int * doall() {
int *a;
a=(int*)malloc(sizeof(int)*2);
a[0]=2;
a[1]=3;
return a;
}
int main() {
int *arr;
arr=doall();
for(int i=0;i<2;i++) {
printf("%d ",arr[i]);
}
printf("\n");
free(arr);
return 0;
}
是否可以free(a);
? free(arr)
是否取消分配&#34; a&#34;在doall
函数?
doall
a=(int*)malloc(sizeof(int)*2);
答案 0 :(得分:4)
由于malloc
返回doall
返回的指针,并且free
调用了该指针,因此 。
虽然有两点
不要将malloc
的结果强制转换为C.(您需要在C ++中执行此操作。)
如果您使用的是C ++,请使用new[]
和delete[]
来管理阵列内存。更好的是,使用std::vector
。
答案 1 :(得分:4)
是否可以
free(a);
没有。到doall
完成时,没有变量a
,只有值。但是,由于此值已分配给arr
,因此您的程序会保留对doall
已分配的块的引用。
free(arr)
功能中a
是否取消分配doall
?
它不会释放a
因为free
被称为变量a
已经消失了。但是,它会释放先前已分配给a
的内存,因此不存在内存泄漏。
答案 2 :(得分:1)
当您调用malloc时,您将获得返回的已分配内存的地址。您将其存储在局部变量a
中,该变量仅在函数执行时才存在。
但是当你return a
返回该局部变量的副本时,调用者将其存储在变量arr
中。此副本是在a
超出范围之前拍摄的。
free
不知道或关心变量名称。它唯一关心的是它获得一个地址,该地址对应于之前调用malloc的返回地址之一。在你的情况下它做了什么,所以一切都很好。
答案 3 :(得分:0)
a就会被释放。在C中,局部变量被压入堆栈并在返回时弹出。