动态内存管理
动态内存管理是在堆区开辟空间
创建局部变量是在栈区开辟空间
创建全局变量——静态区
一、动态内存函数
1.malloc
void* malloc (size_t con);
函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
*如果开辟成功,返回一个指向开辟好空间的指针
*如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查
*malloc返回值的类型是void*
,所以malloc函数不知道开辟空间的类型,具体在使用的时候自己来决定
相关代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[10] = { 0 };
int* p = (int*)malloc(40);
if (p == NULL)
{
perror(malloc);
return 1;
}
else
{
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
free(p);
p = NULL;
return 0;
}
运行结果:
2.calloc
void* calloc (size_t num,size_t con);
*函数的功能是为num个大小为con的元素开辟一块空间,并且把空间的每个字节初始化为0。
*与函数malloc的区别在于calloc会在返回地址之前把申请的空间的每个字节初始化为0。
相关代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)calloc(10,sizeof(int));
if (p == NULL)
{
perror(calloc);
return 1;
}
else
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
free(p);
p = NULL;
return 0;
}
运行结果:
3.realloc
realloc函数让动态内存管理更加灵活,它可以改变我们开始申请的空间(增大或减小)。
相关代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
{
ferror(malloc);
return 1;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
int* ptr = (int*)realloc(p, 80);
if (ptr != NULL)
{
p = ptr;
}
for (i = 10; i < 20; i++)
{
*(p + i) = i;
}
for (i = 0; i < 20; i++)
{
printf("%d ", *(p + i));
}
free(p);
p = NULL;
return 0;
}
运行结果:
4.free
动态内存管理申请空间在运行结束是要释放空间,所以free和malloc、calloc、realloc一起使用。
二、结束语
动态内存管理实际上就是要学好上面的4个函数,学会了malloc、calloc、realloc、free这4个函数也就意味着动态内存管理学会了。