c语言中动态内存管理(1)

1.为什么会存在动态内存分配

1
int arr[1000];

1.像这样建立一个数组,一开始建立了这么大一个空间,可能会造成空间浪费,无法一次性用完

2.静态空间开辟的大小比较固定

3.对于空间的使用,只有我们在运行程序的时候才知道

->因此我们就需要动态内存开辟了

2. 要学习动态内存开辟,就要了解内存中的三个区

这些函数都包含在:

1
#include<stdlib.h>

 3.(1)malloc的使用

malloc函数的定义

void* malloc(size_t size)

返回一个无类型的指针,括号中包含的是开辟的字节数

开辟不成功会返回一个空指针

上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int main()
{
//int arr[10];
int*p = (int*)malloc(100 * sizeof(int));//开辟10个整形空间,有可能会开辟失败

if (p == NULL)
{
printf("malloc error");
return;
}
//可以使用
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i)=i;
}
for (i = 0; i < 10; i++)
{
printf("%d", p[i]);
}
//回收空间用free
free(p);
p = NULL;//用完把他做成空指针
return 0;
}

3.(2).calloc的使用

calloc函数的定义

void* calloc(size_t num,size_t size)

num是开辟的是元素的个数

size为每个元素的长度,单位是字节,1个元素多大

会将里面的元素都初始化为0

上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
/*int *p = (int *)malloc(40);*/
int *p = calloc(10, sizeof(int));//会初始化为0,但参数不一样,其他都一样
if (p == NULL)
{
printf("错误");
}
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d", *(p + i));
}
return 0
}

3.3realloc的使用

realloc函数的定义

void*realloc(void* ptr,size_t size)

p要增加的地址,逗号后面是新的大小,而非增加的大小,返回的是void*,指向的是重新调整之后的内存块
ptr为要调整的内存地址
size为调整之后的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int main()
{
/*int *p = (int *)malloc(40);*/
int *p = calloc(10, sizeof(int));//会初始化为0,但参数不一样,其他都一样
if (p == NULL)
{
printf("错误");
}
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d", *(p + i));
}


if (ptr != NULL)


{
p = ptr;
}

free(p);
p = NULL;

return 0;
}

realloc实现会出现两种情况


c语言中动态内存管理(1)
http://example.com/2021/10/03/c语言中动态内存管理(1)/
作者
Zevin
发布于
2021年10月3日
许可协议