栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言-动态内存分配

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言-动态内存分配

目录
  • 1 问题提出
  • 2 动态内存的分配和管理
    • 2.1 分配内存空间函数 malloc
    • 2.2 分配内存空间函数 calloc
    • 2.3 内存释放函数 free
    • 2.4 内存更改函数 realloc

1 问题提出

在使用数组的时候,总有一个问题困扰着我们,数组应该有多大,比如在单片机接收串口发送过来的数据时,应该准备多大的数组来接收数据比较合适?如果定义的数组比较小,那么便不能接收完整的一帧数据,如果定义的很大,对于单片机有限的RAM空间又会造成严重的浪费。

在使用modbus通讯时,单片机读取数据时,从机都会先发送两个字节的写数据个数,此时,程序如果可以根据这个数据长度字节从新定义一个数组来接收数据,岂不美哉!

因此,动态内存内存分配可以派上用场了,所谓动态内存分配,是指在程序的执行过程中,动态的分配,修改或回收存储空间的分配内存的方法。

2 动态内存的分配和管理

使用动态内存分配函数,需要包含 一下头文件

#include    //使用 malloc(),calloc() 等函数需要包含的文件 
2.1 分配内存空间函数 malloc
  • 函数格式:
void *malloc (unsigned int size)
  • 函数作用:在内存的动态存储区中分配一个长度为size的连续空间。
  • 使用方式:
  1. 首先,创建一个指针变量,用来存放连续分配空间的首地址; 通过 malloc
  2. 函数分配出一个连续的内存空间,并将该空间的首地址赋值给上一步创建的指针变量;
  3. 按照数组的使用方式,使用指针变量;
  • 示例:
#include    //使用 malloc() calloc() 等函数需要包含的文件 
#include
int main(void)
{
	int count;
	int *array;
	
	array=(int*)malloc(10*sizeof(int));//分配一个长度为 sizeof(int)的连续空间 
	
	printf("%d",sizeof(int));
	
	for(count=0;count<10;count++)
	{
		array[count]=count+1;
	}
	for(count=0;count<10;count++)
	{
		printf("n%d",array[count]);
		
	}
	return 0;
}

2.2 分配内存空间函数 calloc
  • 函数格式:
(类型说明符*)calloc (n,size)
  • 函数作用:在内存动态存储区中分配 n 块长度为size 字节的连续区域。
  • 示例:
#include    //使用 malloc()  calloc() 等函数需要包含的文件 
#include
int main(void)
{
	int count;
	struct stu{
		int i;
		char c;
		float f;
	};
	
	struct stu *array;
	
	
	array=(struct stu*)calloc(3,sizeof(struct stu));//分配一个长度为 sizeof(int)的连续空间 
	
	for(count=0;count<3;count++)
	{
		array[count].i=10;
		array[count].c='b';
		array[count].f=55.6;		
	}
	for(count=0;count<3;count++)
	{
		printf("n%d",array[count].i);	
		printf("n%c",array[count].c);	
		printf("n%f",array[count].f);	

	}
	return 0;
}

2.3 内存释放函数 free
  • 函数格式:
void free(void *p)
  • 函数功能:释放指针p所指向的内存。其中,参数p必须是之前调用 malloc 函数 或 calloc 函数时返回的指针。

  • 示例

#include    //使用 malloc(),calloc() 等函数需要包含的文件 
#include
int main(void)
{
	int count;
	struct stu{
		int i;
		char c;
		float f;
	};
	struct stu *array1;
	int  *array2;
	
	
	array1=(struct stu*)calloc(3,sizeof(struct stu));//分配一个长度为 sizeof(int)的连续空间 
	array2=(int*)malloc(10*sizeof(int));//分配一个长度为 sizeof(int)的连续空间 
	free(array1);//释放内存 
	free(array2);//释放内存 
	return 0;
}
2.4 内存更改函数 realloc
  • 函数格式
void *realloc(*p, NewSize);
  • 函数 realloc 的功能是,把之前通过 malloc 函数 或 calloc 函数时返回的指针p,所指向的区域的大小更改为新的NewSize长度,使用该函数的好处是,不用通过free函数释放存储空间,可以直接修改存储空间的长度。

  • 示例

#include    //使用 malloc(),calloc() 等函数需要包含的文件 
#include

int main(void)
{
	int *pp;
	int i;
	pp = (int *)malloc(sizeof(int)*10);
		
	pp = (int *)realloc(pp,sizeof(int)*5);//从新分配一个更小的内存 
	if(pp!=NULL)
	{
		printf("内存分配成功n"); 
	} 
		
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/875091.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号