在这种情况下如何使用 free() 函数?使用 malloc() 和 realloc()

How use free() function in this case? using malloc() and realloc()

你能告诉我在这段代码中我必须将数组“arr”的 free() 函数放在哪里吗?我试图将 free(arr) 放在最后一个 printf() 之前,但这样我的输出是错误的。我也在尝试检查分配的内存是否空闲。

int *boh(int *arr,int n);

int main() {
    int a,i,n;
    int *arr;
    int *b;
    int size = 6;

    arr = (int*) malloc(size* sizeof(int));

    for (i= 0; i<6; i++){
        printf("Give me a number: \n");
        scanf("%d",&a);
        
        if(i != 5){
            arr[i] = a;
        }
        else{
            n = a;
        }
    }


    b = boh(arr,n);


    for(i=0; i<5+n; i++){
        printf("%d\n",b[i]);
    }

    return 0;
}


int *boh(int *arr,int n){
    int *a;
    int i;
    int b;
    b = arr[4];
    a = (int*) realloc(arr,n*sizeof(int)+sizeof(arr));
    
    for(i=5; i<5+n; i++){
        b += b;
        arr[i] = b;
    }
    
    return arr;
}

我认为你的程序有一些缺陷。

这是一个没有内存泄漏的版本:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 6

int *boh(int *arr, int n) {
    int *a;
    int i;
    int b;
    b = arr[SIZE - 2];
    a = (int *) realloc(arr, (n + SIZE) * sizeof(int));
    for (i = SIZE - 1; i < (n + SIZE); i++) {
        b += b;
        a[i] = b;
    }
    return a;
}

int main() {
    int a, i, n;
    int *arr;
    int *b;

    arr = (int *) calloc(SIZE, sizeof(int));

    for (i = 0; i < SIZE; i++) {
        printf("Give me a number: \n");
        scanf("%d", &a);
        if (i != SIZE - 1) {
            arr[i] = a;
        } else {
            n = a;
        }
    }

    b = boh(arr, n);

    for (i = 0; i < (n + SIZE); i++) {
        printf("%d\n", b[i]);
    }

    free(b);

    return 0;
}

您必须将 free 放入您使用 malloc 或类似函数创建的指针。

我检测到的一个问题是您在使用 realloc 时没有传递数组的实际大小。

使用sizeof(arr)是不行的,你必须把它作为参数传递给函数。

Can you tell me where i have to put the free() function for the array "arr" in this code?

没有 适合您的主程序到 free() 指针 arr 的位置,因为函数 boh() 重新分配了它指向的块.此后,您有责任释放的指针是 return 由 realloc() 编辑的指针,而不是原始指针。原始指针必须被视为无效。这两者在实践中可能具有相同的值,但通常情况下它们并不相同。

因此,您的函数 boh 也不得在重新分配后尝试写入 arr 的原始值,就像它在计算 arr[i] = b 时所做的那样。

需要更正这些:

  • 检查每个 malloc()realloc()(以及 calloc())调用的 return 值。这些函数 return 失败时的空指针,在这种情况下您需要以某种方式适应它,例如干净地终止程序。

  • 在验证 realloc() 的 return 值不为 null 后,您的函数 boh 必须使用该值而不是 [=12 的原始值=].一种相当简单的方法是在 for 循环之前将其分配给 arr

         arr = a;
    

    在这种情况下,这也会导致函数 return 新指针值,这是您有责任释放的值。

  • 在主程序中,使用完后释放b(即return之前)。

I'm trying also to check if the memory allocated is free.

C 不提供任何方法来测试指针的分配状态。程序员需要自己跟踪。但是,您可以考虑 运行 您的程序受外部 leak-checking 程序的控制,例如 Valgrind。