关于free和指针你可能没想到的...

本文通过三个C语言实验探讨了free函数释放内存后的行为。实验显示,在某些情况下,释放后的内存区域仍然保留原有数据,但若尝试修改这些数据或将新地址赋给原指针,则可能导致不可预知的行为或产生野指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看例子1

#include <stdio.h>

void test()
{
    char *tmp = (char*)malloc(100);
    strcpy(tmp, "Hello");
    free(tmp);
    
    //try to access tmp
    //由于并没有使用free的内存,所以内存中的数据并没有发生变化
    if(tmp != NULL)
    {
	//strcpy(tmp, "world");
	printf("%s", tmp);
    }
    return;
}

void main()
{
    test();
    return;
}

输出:Hello


在看例子2

#include <stdio.h>

void test()
{
    char *tmp = (char*)malloc(100);
    strcpy(tmp, "Hello");
    free(tmp);
    
    //try to access tmp
    if(tmp != NULL)
    {
	strcpy(tmp, "world");
	printf("%s", tmp);
    }
    return;
}

void main()
{
    test();
    return;
}

//所以情况是这样的,free后,内存并没有为空,还保存有原来的数据。
//而内存若被从新分配后,tmp会指向“垃圾内存”,而成为野指针。

输出:World




接着例子3

#include <stdio.h>

void test()
{
    char *tmp = (char*)malloc(100);
    strcpy(tmp, "Hello");
    free(tmp);
    

    char *tmp1 = (char*)malloc(150);
    strcpy(tmp1, "new memory");

    
    if(tmp != NULL)
    {
	//strcpy(tmp, "world");
	printf("%s\n", tmp);
	strcpy(tmp, "use tmp not tmp1");
	printf("%s\n", tmp);
    }
    return;
}

void main()
{
    test();
    return;
}

输出:Hello

            use tmp not tmp1



理解:关于第三个例子不具有普遍性,若malloc/free次数够多,一定会出现tmp指向凌乱。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值