一、为什么c语言中要有mallocmalloc就是memory allocate动态分配内存,malloc的出现时为了弥补静态内存分配的缺点静态分配内存有如下缺点1、比如说传统的一维数组如int a使用传统的一维数组需要事先指定数组的长度而且数组的长度必须是一个常量宏定义的 常量2、传统数组(静态分配),不能手动释放只能等待系统释放静态分配的变量在该函数内运行的时候有效当静态分配的变量所在函数运行完之后该内存会自动释放。静态分配的内存是在栈中分配的其实在C语言中的函数调用也是通过栈来实现的栈这种数据结构的一个特点就是先进后出所以在调用函数的时候都是先压入栈中然后再从最上面的函数开始执行最后执行到main函数结束。动态分配通过malloc分配是在堆中分配的堆不是一种数据结构它是一种排序方式堆排序。3、传统数组的长度一旦定义之后就不能更改比如说如果我有一个业务在这之前给分配的大小为100但是我现在由于业务数量的增长原来的大小就无法满足。4、静态分配不能跨函数调用就是无法在另一个函数中来管理一个函数中的内存。静态分配只在当前函数有效当静态分配所在的函数运行完之后该变量就不能被其他的函数所调用。二、malloc是什么malloc其实就是一个可以动态分配内存的函数从而可以很好的弥补上面静态分配的缺点。三、malloc怎么使用1、使用malloc函数的时候需要包含一个头文件#include2、malloc函数只接受一个形参如int *p (int *)malloc(sizeof(int)).先来解释下这句话的含义,int* p代表一个以int类型地址为内容的指针变量,p这个变量占4个字节某些计算机,这个p变量是静态分配的一个变量。在某些计算机的前提下指针变量所占的大小都是一样的无论是char* 还是long *因为这些指针变量里面存放的是一个8位16进制的地址所以占四个字节当然这些都是在某些计算机的前提下并不是所有的都是这样的。说道地址的话就和计算机的地址总线有关如果计算机的地址总线是32根每根地址总线只有两种状态(1或0)32根地址线的话如果全为1的话刚好就是一个8位十六进制一位十六进制等于四个二进制(2^416)。32根地址总线可以 表示2^10*2^10*2^10*2^2种状态,可以表示的最大内存为4G,也就是说32根地址总线也就是四个字节 的指针变量最大可以表示4G内存。malloc函数会返回开辟空间的首地址加(int *)的目的是让计算机知道如何去划分这个开辟的空间因为char、int 、long这些类型的字节大小是不一样的,我们知道了首地址还要知道是以几个字节为单元。所以这句话一共开辟了8个字节(某些计算机上)这也是为什么我写sizeof(int)而不是直接写4的原因。3、malloc开辟空间所返回的首地址是动态分配的。四、malloc函数的使用例子# include # include int main(void) { int i 5; //分配了4个字节 静态分配 int * p (int *)malloc(sizeof(4));//指针变量p为静态分配,malloc开辟的空间为动态分配 *p 5; //*p 代表的就是一个int变量,指针变量p表示是一个以int类型的地址为内容的变量 free(p); //freep(p)表示把p所指向的内存给释放掉,p本身的内存是静态的不能由程序员手动释放 //p本身的内存只能在p变量所在的函数运行终止时由系统自动释放 return 0; }# include # include void f(int * q) { *q 200; //free(q); //把q所指向的内存释放掉不然后面在使用*p的时候会报错因为p所指向的内容已经被释放了 } int main(void) { int * p (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数 *p 10; f(p); //p是int *类型 printf(%d\n, *p); return 0; }