静态内存分配:分配大小固定的内存
动态内存分配:在程序执行过程中动态分配或回收存储空间
空间的申请
在C语言函数库中的malloc()函数可用于申请 指定字节数的内存空间
void *malloc(unsigned size)
调用malloc()函数时,通过参数size指定所需申请空间字节数,通过函数的返回值得到所申请空间的首地址。如果系统 所剩余的连续内存不满足要求,函数返回NULL指针,表示申请失败。
malloc()函数所返回的值是指向目标的地址,在实际编程过程中可以通过强制类型转换将该值转换成所要求的的指针类型,然后将它赋予同类型的指针变量,以后就可以通过该指针变量按照所定义的类型实现 对其所指向的目标元素的访问。
double *p;
……
p=(double *)malloc(10*sizeof(double))
其中sizeof运算符计算出每一个double型数据所占据的内存单元数,如果p得到的返回值为非NULL的 指针,就得到能连续存放10个double型数据的内存空间,就可以 通过指针表达式,p,p+1,…,p+9按照double型数据所申请到的空间中的每个数据元素进行访问。
空间的释放
与malloc()函数配对使用的另一个函数时free()函数
void free(char *p)
该函数用于释放由malloc()函数申请的内存空间,被释放的空间可以被malloc()函数在下一次申请时继续使用。
其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。
链表:用一组任意的存储单元存储线性表元素的数据结构。
链表的基本构成单元是结点(Node)
typedef struct node
{
char name[20]; //用来存储姓名
struct node *link; //用来存储其直接后继
}stud;
这样就定义了一个单链表结点结构。定义好链表的结点结构之后,在程序运行时,就可以申请一个结点,然后给数据域中存储适当的数据,如果有后继结点,则把指针域指向其直接后继;若没有,则置为NULL。