关于c中的自由函数

Regarding free function in c

请问如果我在 C 语言中释放一些东西并且我之前将它声明为指针,它只会释放内存但指针仍然存在或者指针数据类型也会随着代码被销毁以下。另外,我可以知道如果我想在这种情况下释放我的内存,为什么我最后会使用 free(list) 而不是使用 free(tmp)?下面是我的代码:

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

int main(void){

    int *list = malloc(3 *sizeof(int));
    if (list==NULL){
        return 1;
    }

    list[0] = 1;
    list[1] = 2;
    list[2] = 3;

    int *tmp = malloc(4 * sizeof(int));
    if (tmp==NULL){
        free(list);
        return 1;
    }

    for (int i = 0; i < 3; i++){
        tmp[i] = list[i];
    }

    tmp[3] = 4;

    free(list);

    list = tmp;

    for (int i = 0; i < 4; i++){
        printf("%i\n", list[i]);
    }

    free(list);
}


调用free 不会影响指针或其内容,只会影响指针指向的内容。但是该指针中的值不应再被视为有效。

关于您对 free 的具体使用的部分已在评论中解决。

在这些声明中

int *list = malloc(3 *sizeof(int));

int *tmp = malloc(4 * sizeof(int));

您声明了两个具有自动存储期限的指针 listtmp。指针本身指向动态分配的数组(数组占用的内存)应该使用函数 free 释放以避免内存泄漏。

调用 free 函数后,指针将具有无效值。

程序首先动态分配了一个包含三个元素的整数数组,并将分配内存的地址分配给指针列表。

int *list = malloc(3 *sizeof(int));

然后程序尝试通过首先动态分配一个包含四个元素的新数组来重新分配数组

int *tmp = malloc(4 * sizeof(int));

如果分配成功则释放旧数组

free(list);

并将新数组的地址再次分配给指针列表。

list = tmp;

即现在 listtmp 两个指针指向同一个动态分配的数组。您可以使用任一指针来释放分配的内存,但逻辑上最好使用指针列表,因为该程序模拟重新分配最初由指针指向的数组 list.