考虑以下代码段:
void f() {
int arr[10];
arr = malloc(sizeof(int) * 100);
for (int i = 0 ; i < 100 ; i++) {
printf("%d ", arr[i]);
}
puts("");
free(arr);
}
当函数f返回时,是否会释放原始arr[10]
堆栈内存? (或者这是堆栈内存泄漏吗?)
答案 0 :(得分:7)
你做不到
arr = malloc(sizeof(int) * 100);
就像你在代码段中所做的那样(尝试做)。 arr
是数组类型,不允许赋值。
随后,也许值得一提,在非动态分配的指针上调用free()
会调用undefined behavior。
FWIW,“泄漏”进入了由动态内存分配(通常是堆)分配的内存。对于在“堆栈”区域(通过编译器)分配的变量,不需要从程序中管理(用于解除分配或免费 - )。
答案 1 :(得分:0)
当你声明数组arr时,你已经在它上面分配了空间(在你的函数堆栈上)。使malloc内存(在堆上分配)分配给该数组是没有意义的。你正在调用编译错误。您应该使用指针而不是声明该数组。指针将为您抓取并存储malloc'd空间。
答案 2 :(得分:0)
int arr [10];这个数组已经从堆栈中分配出来; 分配数组动态声明它作为指针 int * arr;
动态分配不会自动释放,免费或类似免费使用;