我理解malloc
的分配是如何工作的,我可以在发生字节分配的函数内释放变量。但是当我尝试在主要功能中释放它时,我无法释放它。我尝试了多种方法但我无法释放它。我还要感谢解释在C中分配内存的免费工作。
void printArray(int arr[], int count)
{
printf("Values stored in the array are:");
// for loop that goes through printing every value in the array.
for (int i = 0; i < count; i++){
printf("[%d]", arr[i]);
}
}
//function that takes in a size as parameter and creates an array of that size
// and prints it.
void evenOdd(int asize){
int* array = (int*)malloc(asize*sizeof(int));
int position;
// loop that goes through every position in the array and decides if a 0 or
// 1 is assigned.
for(position = 0; position < asize;position++){
if(position%2 == 0){
array[position] = 0;
}else{
array[position] = 1;
}
}
printArray(array,asize);
}
int main(void) {
evenOdd(10);
free(array);
return 0;
}
答案 0 :(得分:4)
您可以在evenOdd
之后释放printArray
中的内存或返回指针,以便调用函数可以释放它:
int *evenOdd(int asize){
int* array = malloc(asize * sizeof *array);
if(array == NULL)
return 0;
int position;
// loop that goes through every position in the array and decides if a 0 or
// 1 is assigned.
for(position = 0; position < asize;position++){
if(position%2 == 0){
array[position] = 0;
}else{
array[position] = 1;
}
}
printArray(array,asize);
return array;
}
int main(void) {
int *array = evenOdd(10);
if(array == NULL)
{
fprintf(stderr, "not enough memory\n");
return 1;
}
free(array);
return 0;
}
我理解
中释放变量malloc
的分配是如何工作的,我可以在函数
请注意,您不释放变量,释放指针指向的内存。
这是一个很好的区别,因此你可以在一个函数中分配内存
只要你的程序“记住”,就可以将它释放到不同的功能中
malloc
/ realloc
/ calloc
返回的地址。你通过返回来实现这一点
在上面的代码中分配了指针。另一种方法是传递一个双
指针:
void bar(int **arr, size_t size)
{
if(arr == NULL)
return;
*arr = malloc(size * sizeof **arr);
if(arr == NULL)
return;
size_t i;
for(i = 0; i < size; ++i)
(*arr)[i] = i % 2;
}
void foo()
{
int *arr = NULL;
bar(&arr, 10);
if(arr == NULL)
{
fprintf(stderr, "not enough memory\n");
return;
}
free(arr);
}
答案 1 :(得分:0)
我清理了代码的格式,使其更清晰(下图)。正如你所写,这将无法编译。当您撰写问题时,请具体说明哪些不起作用/不会发生以及您收到的任何错误。 “代码不会编译并将X视为错误”,而不是“我无法释放它”
在这种情况下,指向数组的指针仅存在于evenOdd函数中,并且不可访问/不在main函数的范围内。当您尝试在main函数中使用它时,main不知道“数组”是什么。
我建议您阅读C语言,特别关注变量范围。有许多方法可以解决这个问题,包括返回指针,将指针传递给evenOdd,然后为其分配内存,或使指针全局化。任何C引用都会给出一个基本的解释,在尝试在黑暗中进行之前,最好先掌握一下语言。
void printArray(int arr[], int count)
{
printf("Values stored in the array are:");
// for loop that goes through printing every value in the array.
for (int i = 0; i < count; i++){
printf("[%d]", arr[i]);
}
}
//function that takes in a size as parameter and creates an array of that size and prints it.
void evenOdd(int asize){
int* array = (int*)malloc(asize*sizeof(int));
int position;
// loop that goes through every position in the array and decides if a 0 or 1 is assigned.
for(position = 0; position < asize;position++){
if(position%2 == 0){
array[position] = 0;
}else{
array[position] = 1;
}
}
printArray(array,asize);
}
int main(void) {
evenOdd(10);
free(array); //array doesn't exist inside main, this won't compile
return 0;
}