动态分布与静态发布:
静态分配
1、 在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。int a [10]
2、 必须事先知道所需空间的大小。
3、 分配在栈区或全局变量区,一般以数组的形式。
4、 按计划分配。
动态分配
1、在程序运行过程中,根据需要大小自由分配所需空间。
2、按需分配。
3、分配在堆区,一般使用特定的函数进行分配。
动态内存分配函数
1.malloc函数
该函数仅针对于指针使用,使用前需要引用malloc.h函数
void * malloc (unsigned int size)
参数size:
size:要开辟的空间的大小
返回值:
成功:开辟好的空间的首地址
失败:NULL
在内存的动态存储区(堆)中分配一个长度为size的连续空间。其参数是一个无符号整数,返回值是一个系统所分配的连续内存空间的起始地址。
若分配内存空间失败(如内存不足等原因)则返回NULL。所以,使用前一定要判断是否为NULL
#include <stdio.h>
#include <stdlib.h>
int main(){int num;scanf("%d",&num);int *ptr=(int *)malloc(num*sizeof(int));if(ptr==NULL){printf("内存分配失败!\n");exit(1);}else {printf("success!");}for(int i=0;i<num;i++){scanf("%d",&ptr[i]);}for(int i=0;i<num;i++){printf("%d ",ptr[i]);}putchar('\n');free(ptr);return 0;
}
2.free函数
#include <stdlib.h>
void free(void *p)
功能:释放堆区的动态内存空间
参数:
ptr:开辟后使用完毕的堆区的空间的首地址
返回值:
无
注意:
- free函数只能释放堆区的空间,其他区域的空间无法使用free
- free释放空间必须释放malloc或者calloc或者realloc的返回值对应的空间,不能说只释放一部分
- free(p); 注意当free后,因为没有给p赋值,所以p还是指向原先动态申请的内存。但是内存已经不能再用了,p变成野指针了,所以一般为了放置野指针,会free完毕之后对p赋 为NULL
- 一块动态申请的内存只能free一次,不能多次free。
//使用free函数释放空间
ferr(p);
//防止野指针
p=NULL;
链表的基本概念
链表,是为了实现动态保存一串数据。注意这里的动态是指不需要预先分配内存空间,而是在需要时动态申请内存。整个数据串保存所需的空间可以根据需要扩大或缩小。而设计的一种数据结构。如:
链表的节点结构
1.数据域:用来储存数据
2.指针域:储存下一个节点元素的地址
如果有后继元素,则指针link会指向下一个元素,若无,这指针指向NULL
struct Stu{char name[20];int age;struct Stu *link;
}