Skip to content

动态内存申请 ​

动态内存申请的API ​

1、malloc申请 堆区空间 ​

c
1 #include <stdlib.h>
2 void *malloc(size_t size);
3 size表示申请的空间字节数
4 函数的返回值:
5 成功:返回值空间起始地址
6 失败:NULL

特点:malloc申请的堆区空间 不自动清0

案例1:申请int空间

c
int *p = NULL;
P = (int*)malloc(sizeof(int))

2、free释放堆区空间 ​

c
1 #include <stdlib.h>
2 void free(void *ptr);
3 ptr需要释放的堆区空间的起始地址

3、memset内存设置函数 ​

c
1 #include <string.h>
2 void *memset(void *s, int c, size_t n);
3 s就是空间的起始地址
4 n就是空间的字节宽度
5 c空间中每个字节 填充的值

案例2:动态数组

c
1 #include <string.h>
2 void test02()
3 {
4 int n = 0;
5 printf("请输入int元素的个数:");
6 scanf("%d", &n);
7
8 //根据元素的个数申请空间
9 int *p = NULL;
10 p = (int *)malloc(n * sizeof(int));
11 if (p == NULL)
12 {
13 return;
14 }
15 //将堆区空间清0
16 memset(p, 0, n * sizeof(int));
17
18 //获取键盘输入
19 int i = 0;
20 for (i = 0; i < n; i++)
21 {
22 scanf("%d", p + i);
23 }
24
25 //遍历数组元素
26 for (i = 0; i < n; i++)
27 {
28 printf("%d ", p[i]); //*(p+i)
29 }
30 printf("\n");
31
32 //释放空间
33 free(p);
34
35 return;
36 }

4、calloc 函数 ​

c
1 #include <stdlib.h>
2 void *calloc(size_t nmemb, size_t size);
3 nmemb:内存的块数
4 size:每一块的字节数
5 返回值:成功为堆区空间起始地址 失败为NULL
6 calloc会对申请的空间 自动清0
c
1 malloc(n*sizeof(int));
2 calloc(n, sizeof(int));

5、realloc函数 追加空间 ​

c
1 #include <stdlib.h>
2 void *realloc(void *ptr, size_t size);
c
int *p = NULL;
p = (int *)calloc(n, sizeof(int));
int new_n = 0;
p = (int *)realloc(p, (n + new_n) * sizeof(int));

内存泄漏 ​

申请的内存,首地址丢了,找不了,再也没法使用了,也没法释放了,这块内存就被泄露了

c
1 char *p;
2 p=(char *)malloc(100);
3 //接下来,可以用 p 指向的内存了
4 p="hello world";//p 指向别的地方了
5 //从此以后,再也找不到你申请的 100 个字节了。则动态申请的 100 个字节就被泄露了

内存的回顾 ​

c
1 //在32位平台
2 void test05()
3 {
4 //字符数组 在栈区 开辟12字节 存放"hello world"
5 char str1[] = "hello world";
6
7 //str2字符指针变量 在栈区 4B 保存文字常量区"hello world"的首元素地址
8 char *str2 = "hello world";
9
10 //str3字符指针变量 在栈区 4B 保存堆区128B空间的起始地址
11 char *str3 = (char *)calloc(128);
12 //将字符串"hello world"拷贝到str3指向的堆区空间
13 strcpy(str3, "hello world");
14
15 }

标准的空间释放 ​

c
1 void test07()
2 {
3 int *p = NULL;
4
5 p = (int *)calloc(1, sizeof(int));
6
7 *p = 100;
8 printf("*p = %d\n", *p);
9
10 if (p != NULL)
11 {
12 free(p);
13 p = NULL;
14 }
15
16 if (p != NULL)
17 {
18 free(p);
19 p = NULL;
20 }
21
22 return;
23 }

释放free本质功能:回收空间权限