动态分配【malloc,free函数】详细介绍和典型实例分析

动态分配

malloc()、free()函数介绍

1、malloc(memory allocation)

中文名称:动态内存分配
malloc()用于申请一块连续的指定大小的内存块区域、以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。malloc(free)函数头文件#include<stdlib.h>

(void *)malloc(int size) #malloc函数原型

由于函数的返回值是void *类型的,所以必须强制转换成你所接收的类型。也就是说,这块内存将要用来存储什么类型的数据。比如:

char *p = (char *)malloc(100);
#在堆上分配了100个字节内存,返回这块内存的首地址,
#把地址强制转换成char *类型后赋给char *类型的指针变量p

注意这点:如果所申请的内存块大于目前堆上剩余内存块(整块),则内存分配会失败,函数返回NULL。注意这里说的“堆上剩余内存块”不是所有剩余内存块之和,因为malloc函数申请的是连续的一块内存。既然malloc函数申请内存有不成功的可能,那我们在使用指向这块内存的指针时,用if(NULL!=p)语句来验证内存是否分配成功。

2、free函数

与malloc对应的是free函数。free函数只有一个参数——所要释放的内存块的首地址(切断指针变量与这块内存的关系)。使用free函数之后指针变量p本身保存的地址并没有改变,那我们就需要重新把p的值变为NULL:

p = NULL;

使用free函数之后指针变量p本身保存的地址并没有改变,那我们就需要重新把p的值变为NULL,以便继续通过p指针来访问内存:

函数使用实例

1、关于C动态申请数组(整形数据类型)空间的应用

#include<stdio.h>
#include<malloc.h>
int main()
{
	int n;//数组元素个数
	int *arr;
	scanf("%d",&n);
	arr=(int *)malloc(sizeof(int)*n);//内存申请
	for(int i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	for(int i=0;i<n;i++)
	{
		printf("%d",arr[i]);
	}
	return 0;
}

2、中文藏头诗(使用动态内存分配和指针数组)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	char *poem[20],mean[20],str[80];
	int i,n=0;
	printf("输入四行后,输出任意字符结束\n");
	scanf("%s",&str); 
	while (n<4){
		poem[n] = (char *)malloc(sizeof(char)*(strlen(str)+1));
		//动态分配 
		strcpy(poem[n],str);
		//将输入的字符串赋值给动态内存单元 
		n++;
		scanf("%s",&str);
	}
	for(i=0;i<4;i++){
		mean[2*i]=*(poem[i]);//每行取第一个字符 
		ps:strlen统计的是字节数,所以汉字占用两个字节.
		mean[2*i+1]=*(poem[i]+1);
	}
	mean[2*i]='\0';
	printf("%s\n",mean);
	for(i=0;i<4;i++)//释放动态内存单元 
	free(poem[i]);
	return 0;
}

在这里插入图片描述

看到这里了,点个赞再走吧!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值