1.malloc和free
函数原型:void* malloc(size_t size);
malloc申请空间
返回一个void*指针,指向了开辟的空间的起始地址
size是要开辟的字节数
free释放空间
void free(void* memblock)
与malloc搭配使用,参数传申请空间的起始位置指针
#include <stdlib.h>
int main()
{
int* ptr=(int*)malloc(40);//像内存中申请40个字节,返回值强转为int*,意思是开辟了10个整形的空间
int* p=ptr;
if(p==NULL)//如果开辟失败就报错,防止对NULL指针的解引用操作
{
perror("malloc");
return 1;
}
//使用申请的空间
int i=0;
for(i=0;i<10;i++)//对内存边界要检查,不要越界访问,只有40个字节的空间
{
*p=i;
i++;
}
free(ptr); //释放空间
ptr=NULL;//防止野指针的出现
}
当我们不释放动态申请的内存时,如果程序结束,动态申请的内存由操作系统自动回收;如果程序不结束,动态内存不会自动回收,就会形成内存泄露问题。
2.calloc
函数原型:void* calloc(size_t num,size_t size);
与malloccalloc申请的空间会被初始化为0
int main()
{
int* p = (int*)calloc(10, sizeof(int));//申请10个整形空间
if (p == NULL)//
{
perror("calloc");
return 1;
}
//使用
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
free(p);
p = NULL;
}
3.realloc
函数原型:void* realloc(void* memblock,size_t size);
对动态内存申请的空间进行扩容
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* ptr = (int*)malloc(40);
int* p = ptr;
if (p == NULL)
{
perror("malloc");
return 1;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*p = i;
printf("%d ", *p);
p++;
}
//空间不够,希望能放20个元素,考虑扩容
int* p1= (int*)realloc(ptr, 80);
if (p1 != NULL)
{
ptr = p1;
}
//扩容成功了,开始使用
p = ptr;
for (i = 0; i < 20; i++)
{
*p = i;
printf("%d ", *p);
p++;
}
//...
//不再使用就释放
free(ptr);
ptr = NULL;
}