当前位置:首页 > 内存 > 正文

动态内存分配算法实现

  • 内存
  • 2024-05-04 13:15:20
  • 218

一、win10系统,怎么增加分配给某个程序的物理内存?系统动态分配内存,小软件不占用内存,所以1GB足够运行。


二、c语言malloc如何实现动态分配

函数原型:externvoid*malloc(unsignedintnum_bytes);

所需头文件:#include

功能:分配长度为num_bytes的内存块返回值:如果分配成功,则将指针返回到分配的内存(该存储区域的初始值不确定),否则返回NULL指针。当内存不被使用时,必须使用free()函数释放内存块。函数返回的指针必须正确对齐,以便它可以与任何数据对象一起使用。

注意:从该函数的原型来看,malloc之前返回的是一个char指针。新的ANSIC标准规定该函数返回空指针,因此必要时需要进行类型转换。

示例:

/*取一列整数,按升序对它们进行排序,最后打印它们*/
#include
​#include 
​#include 
 intCompare_integers(constvoid*a,constvoid*b)
​{<。br/>int*pa=(int*)a;
int*pb=(int*)b;
/*return*pa>*pb?1:*pa<*pb?-1:0*/
inti;
​printf("共有多少个值?");
​if(scanf("%d",&n_values)!=1||n_values<=0)
​{
printf("值的个数非法。\n");
exit(EXIT_FAILURE);
array=(int*)malloc(n_values*sizeof(int));//分配内存来存储这些值
​if(array==NULL)
​{
​printf("无法为如此大量的值获取内存。\n");
退出(EXIT_FAILURE);
if(scanf)("%d",array+i)!=1)
​{
​printf("读取值#%d\n时出错",i);
​free(array);
Exit(EXIT_FAILURE);


qsort(array,n_values,sizeof(int),compare_integers);//使用快速排序方法排序
for(i=0;iprintf("%d\n",array[i]);
free(array);
返回EXIT_SUCCESS;
<}


三、十万火急:谁告诉我个动态规划的例子?1.为什么要使用动态内存分配
但是在我们学习链表之前,如果我们要存储比较大量的相同类型或者结构的数据,我们总是使用数组。例如,如果我们要存储某个班级学生在某个科目上的分数,我们总是定义一个浮点类型(存在0.5分):
Floatscore[30];
但是在使用数组时总有一个问题困扰着我们:数组应该有多大?
在许多情况下,您不确定要使用多大的数组。在上面的例子中,你可能不知道班级里有多少学生,所以你需要将数组定义得足够大。这样,程序在运行时就会申请固定数量的你认为足够大的内存空间。即使知道班级的学生人数,如果由于某种特殊原因导致人数增加或减少,就需要再次修改程序,扩大数组的存储区域。这种分配固定大小内存分配的方法称为静态内存分配。然而,这种内存分配方法有严重的缺点,尤其是在处理某些问题时:大多数情况下,会浪费大量的内存空间。在少数情况下,当你定义的数组不够大时,可能会导致以下标记越界错误,甚至会导致严重的后果。
那么有没有其他方法可以解决这样的外体呢?是的,就是动态内存分配。
所谓动态内存分配是指在程序执行过程中动态分配或回收存储空间的内存分配方法。动态内存分配不需要像数组和其他静态内存分配方法那样预先分配存储。而是系统根据程序的需要立即分配,分配的大小就是程序需要的大小。从上面动态和静态内存分配的对比,我们可以知道动态内存分配相对于晶泰内存分配的特点:
 1、不需要提前分配存储空间;
 2.分配空间可以根据节目的需要进行扩大或缩小。
2、如何实现动态内存分配和管理
为了实现根据程序的需要动态分配存储空间,必须使用以下函数
函数
malloc函数的原型是:
void*malloc(unsignedintsize)
其功能是动态改变内存。在存储区中分配一块长度为size的连续空间。参数是一个无符号整数,返回值是指向分配的连续存储区域的起始地址的指针。另外需要注意的是,当函数分配存储失败(比如内存不足)时,会返回NULL指针。因此,调用该函数时,应检查返回值是否为NULL,并进行相应的操作。
以下示例是动态分配的程序:
#include
#include
main()
{
intcount,*array;/*count是一个计数器,array是一个整型指针,也可以理解为指向整型数组的首地址*/
​if((array(int*)malloc(10*sizeof(int)))==NULL)
printf("无法成功分配存储空间。");
for(count=0;count<10;count++)/*给数组赋值*/
array[count]=count;
for(count=0;count<10;count++)/*打印数组元素*/
​printf("%2d",array[count]);
上例中动态分配了10个整数存储区域,然后分配并打印。示例中,if((array(int*)malloc(10*sizeof(int)))==NULL)语句可分为以下步骤:
1)分配10个连续的整数存储空间,并返回一个指向起始地址的整型指针
​2)将此整型指针地址赋给数组
​3)检查返回值是否为NULL
第二个释放函数
由于内存区域总是有限的,所以不能无限制地分配,程序应该尽量节省资源,所以当分配的内存区域不在时使用时,需要释放它,以便其他变量或程序可以使用它。此时,我们将使用免费功能。
函数原型为:
voidfree(void*p)
函数是释放指针p指向的内存区域。
参数p必须是之前调用malloc函数或calloc函数(另一个动态分配存储空间的函数)时返回的指针。将其他值传递给free函数很可能会导致崩溃或其他灾难性后果。
注意:这里重要的是指针的值,而不是用于查询动态内存的指针本身。示例:
​int*p1,*p2;
​p1=malloc(10*sizeof(int));
​p2=p1;
​……
free(p2)/*或free(p2)*/
malloc的返回值赋给p1,p1的值赋给p2,所以此时p1和p2可以作为免费函数使用。
malloc函数分配存储区域。
free函数释放不再使用的内存区域。
所以这两个函数可以实现内存区域的动态分配和方便管理。