如何从Main函数

时间:2018-01-25 22:41:22

标签: c

我理解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;
}

2 个答案:

答案 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;
}