C语言动态分配示例:地址与指针类型解析及内存释放问题
C语言动态分配示例:指针地址机制与内存释放说明
一、指针与地址传递核心机制
传址修改原变量:
read函数的形参是int *n,main中调用read(&n)时,是把main里局部变量n的内存地址传给了read的形参n。这意味着read里对*n的所有操作,直接作用于main中的n变量——比如scanf("%d", n)是把输入值写入main的n所在内存,while (*n < 1)也是判断main里n的实际值,这就是指针实现的“传址修改”逻辑。指针算术与数组访问:
read里的niz是int*类型指针,指向malloc分配的堆内存起始地址。niz + i利用了C语言的指针算术特性:对于int*类型,加i会自动跳过i * sizeof(int)个字节,直接指向数组的第i个元素,和&niz[i]完全等价。所以scanf("%d", niz + i)就是给数组第i个元素赋值,和用下标niz[i]访问是同一个逻辑。指针返回传递地址:
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
相关产品推荐
相关产品推荐

