You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言动态内存释放实践咨询:代码示例相关疑问

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

char *test(void);

int main()
{
    char *base_ptr = NULL;

    base_ptr = test();

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

    free(base_ptr);
    
    return 0;
}

char *test(void)
{
    char *local_ptr = NULL;

    local_ptr = (char *)malloc(5*sizeof(char));

    for (char i = 0; i < 5; i++)
    {
        scanf(" %hhi", &local_ptr[i]);
    }

    return local_ptr;
}
动态内存管理疑问解答

1. 这种内存释放方式是否存在内存泄漏风险,是否属于良好实践?

这种方式没有内存泄漏风险,而且是C语言里非常常规的良好实践。

  • malloc分配的是堆内存,test函数结束时销毁的只是栈上的local_ptr指针变量本身,它指向的堆内存并不会被自动回收。
  • main函数接收返回的指针后,在使用完成后调用free释放堆内存,整个流程完全符合动态内存管理规则。这种“分配方返回指针,调用方负责释放”的模式在C标准库中也很常见,比如strdup函数就是这种逻辑。

2. 函数结束或return时的内存释放与free函数释放动态内存是否等同?

完全不等同,两者针对的是完全不同的内存区域:

  • 函数结束时释放的是栈上的自动变量(比如test里的local_ptr),这类内存属于自动存储期,由系统自动管理,函数栈帧销毁时会被自动回收,不需要开发者手动操作。
  • free释放的是堆上的动态分配内存,这类内存属于动态存储期,系统不会自动回收,必须由开发者手动调用free来释放,两者的管理机制和作用对象没有任何交集。

3. test函数执行结束后其占用的内存被释放,此时如示例中那样访问该地址是否存在危险?

没有危险。

  • test函数结束后被释放的是它的栈帧内存(比如local_ptr这个指针变量的存储空间),但它返回的是堆内存的地址——这块堆内存并没有被释放,main里的base_ptr持有合法的堆内存地址,访问base_ptr[i]是完全合法的操作。
  • 只有当调用free(base_ptr)之后再去访问该地址,才会出现野指针访问的危险。

内容的提问来源于stack exchange,提问作者Sandrious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:17:20