C语言学习之封装自定义函数,实现类似于malloc函数和free函数的功能

  • 动态内存的分配和释放:
  • 栈的空间分配和回收是由OS负责的;
  • 实际应用时,会感觉到不够灵活,比如空间的大小、生命周期等;
  • 若需要灵活使用内存空间,这时就需要程序员在堆区进行手动分配和释放内存空间;
  • 使用stdlib.h库文件下的malloc函数free函数对内存进行分配和释放所需占用的内存空间;
  • malloc函数说明:
#include <stdlib.h>
void *malloc(size_t size)
//功能:在堆区分配空间
//参数:size就是要分配的空间大小,单位是字节
//返回值:成功就返回分配的空间首地址,失败则返回NULL
  • free函数说明:
#include<stdlib.h>
void free(void *ptr);
//功能:释放由malloc在堆区分配的空间
//参数:要释放的空间的首地址
//返回值:没有
  • 实例要求:
  • 封装自定义的my_malloc函数和my_free函数,在堆区申请一个能存储6个short类型大小的数组空间,最后释放所分配的6个short类型大小的数组空间;
  • 实例分析:
  • 方法1:通过返回值返回所申请的内存空间的首地址如示例代码1所示:
  • 方法2:使用地址传参处理,如示例代码2所示:
  • 示例代码1:
#include<stdio.h>
#include<stdlib.h>

short *my_malloc(){


	short *k = (short *)malloc(sizeof(short)*6);
	return k;
}
void my_free(short **k){

     free(*k);
	 *k = NULL;

}

int main(int argc, const char *argv[])
{
    short *p = my_malloc();
	if(NULL == p){
	
	  printf("内存分配失败\n");

	  return -1;
	
	
	}
	for(int i = 0; i < 6;i++){

		p[i] = rand()%100+1;
	
	}
	for(int i = 0; i < 6;i++){

		printf("p[%d] = %d,p + %d = %p\n",i,p[i],i,p + i);
	
	}

	printf("p = %p\n",p);

	puts("-----------------------------");
	my_free(&p);
	printf("p = %p\n",p);



	return 0;
}
  • 运行结果1:
p[0] = 84,p + 0 = 0x55faa4adc260
p[1] = 87,p + 1 = 0x55faa4adc262
p[2] = 78,p + 2 = 0x55faa4adc264
p[3] = 16,p + 3 = 0x55faa4adc266
p[4] = 94,p + 4 = 0x55faa4adc268
p[5] = 36,p + 5 = 0x55faa4adc26a
p = 0x55faa4adc260
-----------------------------
p = (nil)

  • 示例代码2:
#include<stdio.h>
#include<stdlib.h>

short my_malloc1(short **a){

	*a = (short *)malloc(sizeof(short)*6);
	if(NULL == *a){
	
	   printf("内存分配失败\n");
	   
	   return -1;
	
	}
    return 0;

}


void my_free(short **k){

     free(*k);
	 *k = NULL;

}

int main(int argc, const char *argv[])
{  
	short *p = NULL;
	my_malloc1(&p);

	for(int i = 0; i < 6;i++){

		p[i] = rand()%100+1;
	
	}
	for(int i = 0; i < 6;i++){

		printf("p[%d] = %d,p + %d = %p\n",i,p[i],i,p + i);
	
	}

	printf("p = %p\n",p);

	puts("-----------------------------");
	my_free(&p);
	printf("p = %p\n",p);



	return 0;
}
  • 运行结果2:
p[0] = 84,p + 0 = 0x563e3cd3a260
p[1] = 87,p + 1 = 0x563e3cd3a262
p[2] = 78,p + 2 = 0x563e3cd3a264
p[3] = 16,p + 3 = 0x563e3cd3a266
p[4] = 94,p + 4 = 0x563e3cd3a268
p[5] = 36,p + 5 = 0x563e3cd3a26a
p = 0x563e3cd3a260
-----------------------------
p = (nil)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值