如何在c中的函数中释放分配的数组
how to free an allocated array in a function in c
如果我们要在 main()
中使用 malloc()
,我们可以 free()
在 main()
中进行动态内存分配。
但是,如果我们在不同的函数中使用 malloc()
我们在 main()
中使用该函数,我们应该在哪里调用 free()
来释放在该函数中分配的内存?
即在下面的源代码中:
#include <stdio.h>
#include <stdlib.h>
int * memory_allocate_function(int);
int main(void) {
int n=5; //length of array, 5 for example.
int *my_array;
my_array = memory_allocate_function(n);
return 0;
}
int * memory_allocate_function(int n) {
int i;
int *array;
array=(int *)malloc(n * sizeof(int));
if(array == NULL) {
printf("can not allocate memory.");
return NULL;
}
// I think i can't use "free(array);" in here.
// Because I need that array in main().
return array;
}
这是最好的方法吗?
内存不再需要时应释放。
由于数组在 memory_allocate_function
退出后将不再可访问(因为 array
未返回或以其他方式可供外部访问),因此应在 [=11= 之前释放它] 退出。
void memory_allocate_function(int n){
int i;
int *array;
array = malloc(n*sizeof(int));
if (array == NULL) {
fprintf(stderr, "Out of memory.");
exit(1);
}
// ... use the array ...
free(array);
}
如果你需要在一个函数中 malloc
内存而在另一个函数中需要 free
,你必须以某种方式小心地将指针从 [= 的点传递到那个 malloc
ed 内存11=] 到你想要 free
的地步。
您有责任保留指针值并将其从一个函数传递给另一个函数,直到它到达 free
的点。如果您在此过程中丢失了该值,则会发生内存泄漏。内存泄漏就是你现在所拥有的,因为你没有在任何地方传递那个本地 array
指针。
没有 "one true way" 可以这样做,因为这取决于您的具体意图。例如,您可以 return 来自 memory_allocate_function
的指针,接收它 main
并最终 free
它在那里
int *memory_allocate_function(int);
int main()
{
int n = 5;
int *arr = memory_allocate_function(n);
...
free(arr);
return 0;
}
int *memory_allocate_function(int n)
{
int *array = malloc(n * sizeof *array);
...
return array;
}
使用完它之后 - free
动态分配的内存。但设计明智 - 您可以在其他函数中调用 free
以正确管理它。这真的取决于。对此没有硬性规定。
例如,在这里你应该 return 那个指向已分配内存的指针,然后在 main
中使用它之后你可以在 main()
.
中释放它
所以结构应该是这样的
int* memory_allocate_function(int n)
{
int i;
int *array;
array = malloc(n*sizeof(int));
if(array == NULL)
{
printf("can not allocate memory.");
exit(0);
}
return array;
}
然后在main()
int main(void)
{
int n=5; //length of array, 5 for example.
int *arr = memory_allocate_function(n);
// work with arr
free(arr);
return 0;
}
但是是的 正确命名函数 - 如果你打算使用名称 memory_allocate_function
函数那么只做那个 - 不应该有任何其他主要逻辑。这有助于创建良好的可读代码。
注意一件事 - 当您调用函数然后退出函数时,唯一包含它地址的局部变量,它的存储持续时间结束,您永远无法访问您分配的内存。这是内存泄漏的情况。如果你确定你不会 return 从函数指向内存的指针 - 然后使用它(在相同的函数或不同的函数中)然后释放它(在函数范围结束之前 - 注意不要提及关于释放它的位置,您可以在相同的功能和其他功能中进行。
我不得不提几件事:- 1) 不要强制转换 malloc
的 return 值。 2) 检查 malloc
的 return 值 - 如果它是 NULL
你想单独处理它。 3)main()
的推荐签名为int main(void)
如果我们要在 main()
中使用 malloc()
,我们可以 free()
在 main()
中进行动态内存分配。
但是,如果我们在不同的函数中使用 malloc()
我们在 main()
中使用该函数,我们应该在哪里调用 free()
来释放在该函数中分配的内存?
即在下面的源代码中:
#include <stdio.h>
#include <stdlib.h>
int * memory_allocate_function(int);
int main(void) {
int n=5; //length of array, 5 for example.
int *my_array;
my_array = memory_allocate_function(n);
return 0;
}
int * memory_allocate_function(int n) {
int i;
int *array;
array=(int *)malloc(n * sizeof(int));
if(array == NULL) {
printf("can not allocate memory.");
return NULL;
}
// I think i can't use "free(array);" in here.
// Because I need that array in main().
return array;
}
这是最好的方法吗?
内存不再需要时应释放。
由于数组在 memory_allocate_function
退出后将不再可访问(因为 array
未返回或以其他方式可供外部访问),因此应在 [=11= 之前释放它] 退出。
void memory_allocate_function(int n){
int i;
int *array;
array = malloc(n*sizeof(int));
if (array == NULL) {
fprintf(stderr, "Out of memory.");
exit(1);
}
// ... use the array ...
free(array);
}
如果你需要在一个函数中 malloc
内存而在另一个函数中需要 free
,你必须以某种方式小心地将指针从 [= 的点传递到那个 malloc
ed 内存11=] 到你想要 free
的地步。
您有责任保留指针值并将其从一个函数传递给另一个函数,直到它到达 free
的点。如果您在此过程中丢失了该值,则会发生内存泄漏。内存泄漏就是你现在所拥有的,因为你没有在任何地方传递那个本地 array
指针。
没有 "one true way" 可以这样做,因为这取决于您的具体意图。例如,您可以 return 来自 memory_allocate_function
的指针,接收它 main
并最终 free
它在那里
int *memory_allocate_function(int);
int main()
{
int n = 5;
int *arr = memory_allocate_function(n);
...
free(arr);
return 0;
}
int *memory_allocate_function(int n)
{
int *array = malloc(n * sizeof *array);
...
return array;
}
使用完它之后 - free
动态分配的内存。但设计明智 - 您可以在其他函数中调用 free
以正确管理它。这真的取决于。对此没有硬性规定。
例如,在这里你应该 return 那个指向已分配内存的指针,然后在 main
中使用它之后你可以在 main()
.
所以结构应该是这样的
int* memory_allocate_function(int n)
{
int i;
int *array;
array = malloc(n*sizeof(int));
if(array == NULL)
{
printf("can not allocate memory.");
exit(0);
}
return array;
}
然后在main()
int main(void)
{
int n=5; //length of array, 5 for example.
int *arr = memory_allocate_function(n);
// work with arr
free(arr);
return 0;
}
但是是的 正确命名函数 - 如果你打算使用名称 memory_allocate_function
函数那么只做那个 - 不应该有任何其他主要逻辑。这有助于创建良好的可读代码。
注意一件事 - 当您调用函数然后退出函数时,唯一包含它地址的局部变量,它的存储持续时间结束,您永远无法访问您分配的内存。这是内存泄漏的情况。如果你确定你不会 return 从函数指向内存的指针 - 然后使用它(在相同的函数或不同的函数中)然后释放它(在函数范围结束之前 - 注意不要提及关于释放它的位置,您可以在相同的功能和其他功能中进行。
我不得不提几件事:- 1) 不要强制转换 malloc
的 return 值。 2) 检查 malloc
的 return 值 - 如果它是 NULL
你想单独处理它。 3)main()
的推荐签名为int main(void)