1.为什么会存在动态内存分配
如
int arr[1000];
1.像这样建立一个数组,一开始建立了这么大一个空间,可能会造成空间浪费,无法一次性用完
2.静态空间开辟的大小比较固定
3.对于空间的使用,只有我们在运行程序的时候才知道
->因此我们就需要动态内存开辟了
2. 要学习动态内存开辟,就要了解内存中的三个区
这些函数都包含在:
#include<stdlib.h>
3.(1)malloc的使用
malloc函数的定义
void* malloc(size_t size)
返回一个无类型的指针,括号中包含的是开辟的字节数
开辟不成功会返回一个空指针
上代码
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
上代码
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为调整之后的大小
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实现会出现两种情况