c语言中free()函数做了什么

注:以下程序由Ubuntu系统下GCC9.3.0编译完成

当使用free(ptr)释放由malloc()等内存分配函数分配的堆内存时,该函数都做了如下工作:

1. 解除指定指针对该内存的引用,使得此堆内存可以重新被分配

2. 对该内存上得数据清零

需要注意得是,free()后得指针仍然保留该堆内存得地址,并且仍然可以访问。访问free得堆内存是未定义行为,所以为了保证程序得安全,通常在free后会将指针置为NULL,即ptr=NULL。

示例代码:

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

int main()
{
    int *ptr;

    puts("int:");
    if ((ptr = malloc(sizeof(int))) != NULL)
    {
        *ptr = 100;
        printf("before free pointed address: 0x%lx\n", (unsigned long) ptr);
        printf("before free pointed value: %d\n", *ptr);
        free(ptr);
        printf("after free pointed address: 0x%lx\n", (unsigned long) ptr);
     // 被free后该地址仍可访问
        printf("after free pointed value: %d\n", *ptr);
        *ptr = 1;
        printf("after being modified pointed value: %d\n", *ptr);
    }

    puts("string:");

    char *strptr;

    if ((strptr = malloc(sizeof(char)*6)) != NULL)
    {
        strncpy(strptr, "hello", 6);
        printf("before free pointed address: 0x%lx\n", (unsigned long) strptr);
        printf("before free stored string: %s\n", strptr);
        free(strptr);
        puts("freed");
        printf("after free pointed address: 0x%lx\n", (unsigned long) strptr);
     // 被free后该地址仍可访问
        printf("after free stored string: %s\n", strptr);
        strptr = "hhhhh";
        printf("after being modified stored string: %s\n", strptr);
    }

    exit(EXIT_SUCCESS);
}
 

输出

int:
before free pointed address: 0x55c49d1606b0
before free pointed value: 100
after free pointed address: 0x55c49d1606b0
after free pointed value: 0
after being modified pointed value: 1
string:
before free pointed address: 0x55c49d1606b0
before free stored string: hello
freed
after free pointed address: 0x55c49d1606b0
after free stored string: 
after being modified stored string: hhhhh

 

posted @ 2022-01-12 21:34  minexy  阅读(625)  评论(0)    收藏  举报