动态内存分配可以在程序运行的时候随时分配存储位置
动态分配的存储位置一定来自于堆这个段落
堆中的所有存储位置需要使用语句分配和回收
c语言中提供几个标准函数用来分配和回收堆中的存储位置
为了使用这些函数需要包含stdlib.h文件
malloc标准函数用来动态分配多个连续的字节存储位置
malloc把分配后第一个字节的地址赋值给返回值变量
malloc返回值是void*指针,可以转换成任何类型的指针使用
malloc在失败的时候会把NULL赋值给返回值变量
free标准函数用来回收不再使用的动态分配存储位置
释放内存时需要使用第一个字节的地址作为参数
一次分配得到的所有存储位置必须统一释放(不能释放一半留一半)
一段动态分配的内存智能释放一次,释放后记录它的地址的指针将变成野指针
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main() {
5 int num = 0;
6 int *p_num = (int *)malloc(3 * sizeof(int));
7 if(p_num) {
8 for(num = 0; num <= 2; num++) {
9 *(p_num + num) = num + 1;
10 }
11 for(num = 0; num <= 2; num++) {
12 printf("三个数依次是%d ", *(p_num + num));
13 }
14 printf("\n");
15 free(p_num);
16 p_num = NULL;
17 }
18 return 0;
19 }
求中点(动态分配内存)
1 #include <stdio.h>
2 #include <stdlib.h>
3 typedef struct pt {
4 int x, y;
5 } pt;
6 pt *midpt(const pt *p_start, const pt *p_end) {
7 pt *p_ret = (pt *)malloc(sizeof(pt));
8 if(p_ret) {
9 p_ret->x = (p_start->x + p_end->x) / 2;
10 p_ret->y = (p_start->y + p_end->y) / 2;
11 }
12 return p_ret;
13 }
14 int main() {
15 pt start = {}, end = {}, *mid = NULL;
16 printf("请输入第一个点的位置:");
17 scanf("%d%d", &start.x, &start.y);
18 printf("请输入第二个点的位置:");
19 scanf("%d%d", &end.x, &end.y);
20 mid = midpt(&start, &end);
21 if(mid) {
22 printf("中点(%d, %d)\n", mid->x, mid->y);
23 }
24 free(mid);
25 mid = NULL;
26 return 0;
27 }
二级指针形参可以把被调函数动态分配的存储位置交给调用函数使用
这个二级指针形参对应的一级指针存储位置必须由调用函数提供