首页 > 解决方案 > 动态内存中的 free()

问题描述

free()在下面的代码中使用正确吗?是内存泄漏吗?free()在主要部分而不是功能中使用是否有问题?如果是,有一种方法可以在函数中释放而不是在 main 中?

此代码将一个数组复制到另一个数组中。

int *copy(const int *arr,int n);

int main(){
    int *p_arr1,*p_arr2;
    int n,i;

    printf("Insert size of array: ");
    scanf("%d",&n);

    p_arr1 = calloc(n,sizeof(int));

    for(i=0;i<n;i++){
        printf("Insert element %d of the array: ",i+1);
        scanf("%d",p_arr1+i);
    }

    p_arr2 = copy(p_arr1,n);

    for(i=0;i<n;i++){
        printf("%d ",*p_arr2);
        p_arr2++;
    }

    free(p_arr1);
    free(p_arr2);

    return 0;
}

int *copy(const int *arr,int n){
    int i;
    int *new;
    new = calloc(n, sizeof(int));
    for(i=0;i<n;i++){
        new[i] += arr[i];
    }

    return new;
}

标签: carraysdynamic-memory-allocationfree

解决方案


只要您有malloc(或在您的情况下calloc)返回的指针,您就可以将它传递给free您想要的时间和任何地方,它不必在同一个函数中。

但是,在打印 的内容的循环之后p_arr2,您不再有calloc函数内部返回的指针,因为您修改了循环中的指针。

您需要为循环使用临时指针变量:

int *p_arr2_tmp = p_arr2;
for (size_t i = 0; i < n; ++i)
{
    printf("%d ", *p_arr2_tmp);
    ++p_arr2_tmp;
}

// Now we can free the memory pointed to by the original p_arr2 pointer
free(p_arr2);

或者您可以改用简单的数组索引:

for (size_t i = 0; i < n; ++i)
{
    printf("%d ", p_arr2[i]);
}

// The pointer p_arr2 wasn't modified, so it can be passed to free
free(p_arr2);

推荐阅读