动态内存分配

malloc函数的使用

malloc是memory(内存)+allocation(分配)的合成词

malloc系统函数的功能:动态内存分配

内存分配机制分为两种:

  1. 静态内存分配:程序运行是,由OS自动分配内存空间函数结束时,由os自动收回。

  2. 动态内存分配:程序运行是,由程序员调用free()手动收回,如果程序运行过程中不手动收回,程序结束时系统也会自动收回,但有些程序经常几个月不关机一直工作(如操作系统unix/linux)

手动收回内存空间

程序例:

#include <stdio.h>
#include <malloc.h>
//系统库函数malloc和free都放在malloc.h里面
int main(void)
{
    int i=5;//定义静态整型变量i:静态分配4个字节连续内存空间
    int *p;//定义静态整型指针变量p:用来认领这块动态内存空间
    (int*) malloc(4)//用malloc函数动态分配了4个字节的连续内存空间成功后返回该4个字节的连续内存空间中的首字节地址到函数的调用位置
    *p=100;//通过指针引用去使用这块整型动态内存空间
    printf("%d\n",*p);
    free(p);//使用完毕之后用free函数(c程序结束前)手动释放所指向的动态内存空间
    return 0;
}

明确7点

  1. malloc和free都是系统库函数,使用前必须引用"malloc.h"这个头文件

  2. malloc的形参:只有一个形参且类型为int型该形参表示请求系统为该程序分配几个字节的连续空间,例如malloc(4)表示请求系统为该程序分配4个连续的字节空间

  3. malloc函数的返回值:为该连续的内存空间的首字节地址(即入口地址)

  4. (int*)表示:把malloc返回的首字节地址,全部强制转换为整型变量的地址,或者说让机器把malloc申请到的4个连续字节空间当作一个整型变量的空间来看待使用

  5. P本身占4个字节,属于静态分配,而P指向的空间也占4个字节属于动态分配因此free(p)手动释放的是p所指向的内存空间至于静态指针变量则由操作系统在函数进行完毕之后自动释放

  6. 静态内存在栈中分配:(在函数调用完毕后)由OS自动释放,动态内存在堆中分配:(在程序运行结束前)由程序员手动释放(在程序运行结束后)由操作系统自动释放

  7. Free(p)表示:手动释放p所指向的动态内存空间,而不是手动释放p变量自身所占的4个字节静态内存空间如果你忘记手动释放(即内存泄漏)除非你关闭该程序(即结束了与该程序有关的一切进程)或者重启电脑(堆区就在进程中程序关闭进程都不在了,被进程占用的所有资源都会被OS自动收回)最怕的不是忘记释放,而是重复释放(即对同一片动态内存空间释放两次)其中后果是让整个程序崩溃!!!

这就是为什么今天java,python等面向对象的高级语言禁用指针(改为引用)的根本原因

yukikaze nano desu!