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

C语言动态分配示例:地址与指针类型解析及内存释放问题

C语言动态分配示例:指针地址机制与内存释放说明

一、指针与地址传递核心机制

  1. 传址修改原变量:read函数的形参是int *n,main中调用read(&n)时,是把main里局部变量n的内存地址传给了read的形参n。这意味着read里对*n的所有操作,直接作用于main中的n变量——比如scanf("%d", n)是把输入值写入main的n所在内存,while (*n < 1)也是判断main里n的实际值,这就是指针实现的“传址修改”逻辑。

  2. 指针算术与数组访问:read里的niz是int*类型指针,指向malloc分配的堆内存起始地址。niz + i利用了C语言的指针算术特性:对于int*类型,加i会自动跳过i * sizeof(int)个字节,直接指向数组的第i个元素,和&niz[i]完全等价。所以scanf("%d", niz + i)就是给数组第i个元素赋值,和用下标niz[i]访问是同一个逻辑。

  3. 指针返回传递地址:read函数返回niz,本质是返回malloc分配的堆内存的起始地址值。main里的int *niz接收这个地址后,就拥有了对这块堆内存的完整访问权限——后续用niz[i]遍历数组,就是通过这个地址定位到对应的内存单元。

二、main函数释放内存的合法性

完全可以在main中调用free(niz)释放内存,原因如下:

  • malloc分配的内存位于堆区,不属于任何函数的栈帧,只要持有有效的堆内存起始地址,无论在哪个函数中都可以调用free释放。
  • main里的niz保存的正是read中malloc返回的合法地址,全程未被非法修改,所以free(niz)是合法且正确的操作,能正常释放堆内存,避免内存泄漏。

注意:如果niz被修改为无效地址(比如指向栈内存、已释放的地址),再调用free会触发未定义行为,但本示例不存在这种情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:48:25