C语言动态内存管理
程序开发过程中,很多情况是不能够预先知道需要多大的内存,此时内存就需要随用随获取。比如链表的插入,不确定大小数组的建立。C语言中动态内存获取的接口函数在<stdlib.h>头文件中,下面就来详细讲解下C语言中内存的动态获取。
1、malloc
函数原型:
void *malloc(size_t size); //调用实际生产空间比期望的大
函数作用:malloc函数向内存申请一块连续的大小为size字节的可用空间,并返回指向这块空间的指针
函数返回值:开辟成功,则返回一个指向开辟好空间的指针;开辟失败,则返回一个NULL,因此malloc的返回值一定要做检查
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = 10;
int *p = (int*)malloc(num * sizeof(int));
if (p == NULL) {
printf("mallcoc error\n");
} else {
for (int i = 0; i < num; i++) {
*(p+i) = i;
}
for (int i = 0; i < num; i++) {
printf("%d ",p[i]);
}
printf("\n");
}
free(p);
p = NULL;
return 0;
}
2、calloc
函数原型:
void *calloc(size_t num, size_t size);
函数作用:calloc函数向内存申请num个大小为size的连续空间,并且把空间的每个字节初始化为0
#include <stdio.h>
#include <stdlib.h>
int main()
{
size_t num = 10;
int *p = (int*)calloc(num, sizeof(int));
if (p == NULL) {
printf("calloc error\n");
} else {
for (int i = 0; i < num; i++) {
*(p+i) = i * i;
}
for (int i = 0; i < num; i++) {
printf("%d ",p[i]);
}
printf("\n");
}
free(p);
p = NULL;
return 0;
}
3、realloc
函数原型:
void *realloc(void *ptr, size_t size);
函数作用:将ptr指向的空间大小调整到size字节,完成后返回空间的首地址
函数参数:ptr:待调整的内存;
size:待调整的内存大小
#include <stdio.h>
#include <stdlib.h>
int main()
{
size_t num = 10;
int *p = (int*)malloc(num * sizeof(int));
if (p == NULL) {
printf("malloc error\n");
} else {
for (int i = 0; i < num; i++) {
*(p+i) = i;
}
for (int i = 0; i < num; i++) {
printf("%d ",p[i]);
}
printf("\n");
}
size_t num2 = 2 * num;
p = (int*)realloc(p, num2);
if (p != NULL) {
for (int i = 0; i < num2; i++) {
*(p+i) = i + 3;
}
for (int i = 0; i < num2; i++) {
printf("%d ",p[i]);
}
printf("\n");
}
free(p);
p = NULL;
return 0;
}
4、free
函数原型:
void free(void *ptr); //释放前后地址不变,只是把指针和空间的关联取消。此时的指针为野指针。
函数作用:释放释ptr所指向的内存块,释放的是动态分配的内存空间