当前位置:   article > 正文

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

c语言 封装malloc 和free
  • 动态内存的分配和释放:
  • 栈的空间分配和回收是由OS负责的;
  • 实际应用时,会感觉到不够灵活,比如空间的大小、生命周期等;
  • 若需要灵活使用内存空间,这时就需要程序员在堆区进行手动分配和释放内存空间;
  • 使用stdlib.h库文件下的malloc函数free函数对内存进行分配和释放所需占用的内存空间;
  • malloc函数说明:
#include <stdlib.h>
void *malloc(size_t size)
//功能:在堆区分配空间
//参数:size就是要分配的空间大小,单位是字节
//返回值:成功就返回分配的空间首地址,失败则返回NULL
  • 1
  • 2
  • 3
  • 4
  • 5
  • free函数说明:
#include<stdlib.h>
void free(void *ptr);
//功能:释放由malloc在堆区分配的空间
//参数:要释放的空间的首地址
//返回值:没有
  • 1
  • 2
  • 3
  • 4
  • 5
  • 实例要求:
  • 封装自定义的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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 运行结果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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 示例代码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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 运行结果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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/969395
推荐阅读
相关标签
  

闽ICP备14008679号