动态内存函数:malloc,calloc,realloc的介绍

动态内存函数:malloc,calloc,realloc的介绍

malloc

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

  1. 类型:动态内存分配函数,被包含在malloc.h,stdlib.h
  2. 函数原型:void *malloc(unsigned int num_bytes),一个参数
  3. 功能:分配长度为num_bytes字节的内存块,申请的内存值不确定
  4. 返回值:如果分配成功则返回指向被分配起始地址的指针,否则返回空指针NULL。返回类型是void型,使用强制类型转换 int *p=(int *)malloc(sizeof(int))
  5. 注意:当内存不再使用时,应使用free()函数将内存块释放
1.如果开辟成功,则返回一个指向开辟好空间的指针。
2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
3.返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
eg:开辟10个整形的空间 int* p = (int*)malloc(10*sizeof(int));
4.如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

#include <stdio.h>
int main()
{
int* ptr = NULL;
ptr = (int*)malloc(4*sizeof(int));
if(NULL != ptr)//判断ptr指针是否为空
{
int i = 0;
for(i=0; i<4; i++)
{
*(ptr+i) = 0;
}
}
free(ptr);//释放ptr所指向的动态内存
//ptr = NULL;//
return 0;
}

calloc

int main()
{
	int* p = calloc(10, sizeof(int));

	if (p == NULL)
		return 1;

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", *(p + i));
	}

	free(p);
	p = NULL;

	return 0;
}

realloc

realloc的函数的作用是对动态分配好的内存空间的大小进行调整。当我们一次性开辟的内存不够时,可以利用这个函数进行二次分配。

void* realloc (void* ptr, size_t size);

ptr 是要调整的内存地址
size 调整之后新大小
返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。

realloc在调整内存空间的是存在两种情况:

情况1:原有空间之后有足够大的空间
在这里插入图片描述

当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。

情况2:原有空间之后没有足够大的空间
在这里插入图片描述

当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址

注意:
1.realloc函数必须是对malloc函数或者calloc函数申请的空间进行修改。
2.realloc有可能找不到合适的空间来调整大小,这时就返回 NULL

拓展:
realloc在单独使用的时候功能类似malloc

int main()
{
	int* p = (int*)realloc(NULL, 40);//这里功能类似于malloc,就是直接在堆区开辟40个字节

	return 0;
}

void test01(){
 
 int* p1 = calloc(10,sizeof(int));
 if (p1 == NULL){
  return;
 }
 for (int i = 0; i < 10; i ++){
  p1[i] = i + 1;
 }
 for (int i = 0; i < 10; i++){
  printf("%d ",p1[i]);
 }
 printf("\n");
 free(p1);
}
 
void test02(){
 int* p1 = calloc(10, sizeof(int));
 if (p1 == NULL){
  return;
 }
 for (int i = 0; i < 10; i++){
  p1[i] = i + 1;
 }
 
 int* p2 = realloc(p1, 15 * sizeof(int));
 if (p2 == NULL){
  return;
 }
 
 printf("%d\n", p1);
 printf("%d\n", p2);
 
 //打印
 for (int i = 0; i < 15; i++){
  printf("%d ", p2[i]);
 }
 printf("\n");
 
 //重新赋值
 for (int i = 0; i < 15; i++){
  p2[i] = i + 1;
 }
 
 //再次打印
 for (int i = 0; i < 15; i++){
  printf("%d ", p2[i]);
 }
 printf("\n");
 
 free(p2);
}

切记:动态开辟的空间一定要释放,并且正确释放(释放多次、释放一部分等都是不正确的释放)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值