- 动态内存的分配和释放:
- 栈的空间分配和回收是由OS负责的;
- 实际应用时,会感觉到不够灵活,比如空间的大小、生命周期等;
- 若需要灵活使用内存空间,这时就需要程序员在堆区进行手动分配和释放内存空间;
- 使用
stdlib.h
库文件下的malloc函数
和free函数
对内存进行分配和释放所需占用的内存空间; - malloc函数说明:
#include <stdlib.h>
void *malloc(size_t size)
#include<stdlib.h>
void free(void *ptr);
- 实例要求:
- 封装自定义的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;
}
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)
#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;
}
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)