第7讲 动态分配内存-
动态内存分配(C语言)

实验报告实验课程名称:动态内存分配算法年12月1日实验报告一、实验内容与要求动态分区分配又称为可变分区分配,它是根据进程的实际需要,动态地为之分配内存空间。
在实验中运用了三种基于顺序搜索的动态分区分配算法,分别是1.首次适应算法2.循环首次适应算法3.最佳适应法3.最坏适应法分配主存空间。
二、需求分析本次实验通过C语言进行编程并调试、运行,显示出动态分区的分配方式,直观的展示了首次适应算法循环首次适应算法、最佳适应算法和最坏适应算法对内存的释放和回收方式之间的区别。
首次适应算法要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后在按照作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空余分区仍留在空链中。
优点:优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区,为以后到达的大作业分配大的内存空间创造了条件。
缺点:低址部分不断被划分,会留下许多难以利用的、很小的空闲分区即碎片。
而每次查找又都是从低址部分开始的,这无疑又会增加查找可用空闲分区时的开循环首次适应算法在为进程分配内存空间时,不是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区。
优点:该算法能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的开销。
最佳适应算法该算法总是把能满足要求、又是最小的空闲分区分配给作业,避免大材小用,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
缺点:每次分配后所切割下来的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的碎片。
最坏适应算法最坏适应算法选择空闲分区的策略正好与最佳适应算法相反:它在扫描整个空闲分区或链表时,总会挑选一个最大的空闲区,从中切割一部分存储空间给作业使用。
该算法要求,将所有的空闲分区,按其容量以大到小的顺序形成一空闲分区链。
动态分配(共4张PPT)

typOeSdM数ef e的smtr原uPcu型tt{( 为)函:数的原型为: void *OSAddr;
//内存分区的指针
IvNoTiOd8US_*MOOSESMFMreem*eOPLuSistMt(;emCreate(//分区内内存块链表的头指针 应OINS用T_v程oM3i2dE序U*Ma可dOdS*以r,Bpm通lkeS过miz调,e; 用/函/内数/存/内O/块/存内SM所分存e属区m块的Q内的u起存长er始y分度(地区)址来的查指询针一个分区目前的
} OS_MEM; void **OOSSMAedmdrG; et (
INT32U OSMemNBlks; //分区内内存块的数目
//内存分区的指针
应OS用_程ME序M如*果pm要e使m用, 动态内存//内的存话块,所则属要内首存先分在区内的存指中针划分出可以进行动态分配的区域,这个划分出来区域叫做内存分区,每个分区要包含若干个
μC/OS-II对内存进行两级管理,即把一个大片 连续的内存空间分成了若干个分区,每个分区 又分成了若干个大小相等的内存块来进行管理。 操作系统以分区为单位来管理动态内存,而任 务以内存块为单位来获得和释放动态内存。内 存分区及内存块的使用情况则由表——内存控
制块来记录。
本节首先介绍内存分区和分区中的内存块,然后 再介绍内存控制块。
内能IINN当存否TT81块 合U6应U。理OIn、用SItMNM有ee程效Tmm地BP1uu序对6ft[1(内U0调]存[1I储0用n];器tM进函行e分数m配BO和管uSf理M[,1e是0m衡][量C1一0r个e];a操t作e系( 统)建品质立的指了标之一一。个内存分区之后,内存控制块
动态内存分配

scanf("%ld,%f",&p1->num,&p1->score);
p1
p2
10101 89.5
程序设计实习 31
解题思路:
读入一个学生的数据给p1所指的第一个结点
scanf("%ld,%f",&p1->num,&p1->score); 使head也指向新开辟的结点
head
p1
p2
10101 89.5
程序设计实习 32
解题思路:
再开辟另一个结点并使p1指向它,接着输入该
结点的数据
head
p1
p2
10101 89.5
程序设计实习 33
解题思路:
再开辟另一个结点并使p1指向它,接着输入该
结点的数据 p1=(struct Student*)malloc(LEN); scanf("%ld,%f",&p1->num,&p1->score); head p2 p1
void* calloc(unsigned int num, unsigned int size);
向系统申请num个size大小的内存块 把首地址返回,若申请不成功则返回NULL
程序设计实习 4
动态内存分配函数
Method of deallocating memory:
void* free(void* p);
next
data
next
data
NULL
程序设计实习
15
链表的定义
链表(Linked list):
动态分配内存函数

动态分配内存函数1. 定义动态分配内存函数是一类在程序运行时,根据需要动态分配内存空间的函数。
在C/C++ 程序中,常用的包括malloc、calloc、realloc和free等函数。
2. 常见动态分配内存函数2.1 malloc 函数•定义:void *malloc(size_t size);•用途:在堆(Heap)上分配指定大小的内存空间,并返回一个指向该内存空间的指针。
•工作方式:malloc函数会根据指定的size参数来分配一块连续的内存空间。
如果成功分配,函数会返回该内存块的起始地址,如果分配失败则返回NULL。
需要注意,调用malloc函数后需要手动释放已分配的内存空间。
2.2 calloc 函数•定义:void *calloc(size_t num, size_t size);•用途:在堆(Heap)上分配指定数量和大小的内存空间,并返回一个指向该内存空间的指针。
•工作方式:与malloc函数类似,calloc函数也会分配一块连续的内存空间,但不同的是,calloc函数会将分配的内存空间全部初始化为零。
函数的num参数表示要分配的元素数量,size参数表示每个元素的大小。
如果成功分配,函数会返回指向该内存块的起始地址,如果分配失败则返回NULL。
2.3 realloc 函数•定义:void *realloc(void *ptr, size_t size);•用途:重新分配已分配内存的大小,并返回一个指向新内存空间的指针。
•工作方式:realloc函数用于重新调整已分配内存块的大小。
函数的第一个参数ptr是一个指向之前分配的内存空间的指针,size参数表示新的大小。
realloc函数的工作方式如下:1.如果ptr为空指针(即之前没有分配过内存),则等同于malloc函数,分配一块新的内存空间,并返回指向该空间的指针。
2.如果ptr不为空指针而且size不为零,则会尝试调整ptr所指向的内存空间的大小。
《动态分配内存》课件

由于游戏需要在各种设备和配置上运行,因此优化内存使用至关重要。通过动态内存分配,可以更有效地管理内存,避免内存泄漏和性能问题。
BIG DATA EMPOWERS TO CREATE A NEWERA
动态内存分配的性能优化
缓存对齐是一种优化技术,通过将数据结构或对象在内存中按一定规则排列,使其在物理内存中的地址与缓存行大小对齐,从而减少缓存未命中的概率,提高数据访问速度。
总结词:动态内存分配函数详细描述:calloc()函数用于在运行时动态分配内存。与malloc()不同的是,calloc()会初始化所分配的内存为0。它根据所需的元素数量和每个元素的大小,在堆区分配一块连续的内存空间,并返回指向该空间的指针。如果分配成功,返回非空指针;如果分配失败,返回NULL。参数:calloc()函数的参数是需要分配的元素数量和每个元素的大小,单位分别是字节和元素个数。返回值:返回一个指向所分配内存的指针,如果分配失败则返回NULL。
动态数组
链表
在处理字符串时,我们经常需要将多个字符串连接在一起。为了实现这一点,通常需要动态分配足够的内存来存储连接后的字符串。
字符串连接
将一个字符串分割成多个部分时,可能需要为分割后的子字符串分配内存。
字符串分割
游戏对象管理
在游戏开发中,可能会创建大量的游戏对象(如角色、物品、敌人等)。为了有效地管理这些对象,通常需要在运行时动态分配内存。
栈内存分配
通过预先分配一块较大的内存区域,并按照需求将其划分为多个小块进行动态分配和回收,以提高内存分配和释放的效率。
动态内存池
BIG DATA EMPOWERS TO CREATE A NEWERA
动态内存分配函数
总结词:动态内存分配函数详细描述:malloc()函数用于在运行时动态分配内存。它根据所需的内存大小,在堆区分配一块连续的内存空间,并返回指向该空间的指针。如果分配成功,返回非空指针;如果分配失败,返回NULL。参数:malloc()函数的参数是需要分配的内存大小,单位是字节。返回值:返回一个指向所分配内存的指针,如果分配失败则返回NULL。
C语言中关于动态内存分配的详解

C语⾔中关于动态内存分配的详解⽬录⼀、malloc 与free函数⼆、calloc三、realloc四、常见的动态内存的错误【C语⾔】动态内存分配本期,我们将讲解malloc、calloc、realloc以及free函数。
这是个动态内存分配函数的头⽂件都是 <stdlib.h>。
c语⾔中动态分配内存的函数,可能有些初学c语⾔的⼈不免要问了:我们为什么要通过函数来实现动态分配内存呢?⾸先让我们熟悉⼀下计算机的内存吧!在计算机的系统中⼤致有这四个内存区域:1)栈:在栈⾥⾯储存⼀些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存⼀些字符常量,⽐如:char *p=”hello world”;其中”hello world”就储存在字符常量区⾥⾯;3)全局区:在全局区⾥储存⼀些全局变量和静态变量;堆:堆主要是通过动态分配的储存空间,也就是我们接下需要讲的动态分配内存空间。
静态内存和动态内存的⽐较:静态内存是有系统⾃动分配,由系统⾃动释放。
静态内存是在栈分配的。
(例如:函数⾥的局部变量)动态内存是由程序员⼿动分配,⼿动释放。
动态内存是在堆分配的。
(例如:⽤C语⾔写链表时,需要⾃⼰对Node结点分配内存空间)⼀、malloc 与free函数void* **malloc( size_t ** size);返回类型: void*,也就是说这个函数的可以返回所有类型的指针形式。
只需要在开辟空间的时候进⾏强制类型转换⼀下即可。
函数参数:size_t size, 这个参数就是告诉这个函数,你需要开辟多少个字节的内存空间。
void free(void* memblock) ;没有返回参数。
函数参数:void* memblock, free函数可以接收来⾃所有类型指针的动态分配的内存空间。
⼀切以栗⼦来描述吧:#include <stdlib.h>#include <stdio.h>int main(){//开辟10个int类型的空间int* arr = (int*)malloc(10 * sizeof(int)); //切记这⾥给的⼤⼩,是10 * int(4个字节)int i = 0;if (arr == NULL){perror("malloc"); //有可能,malloc开辟空间失败,则malloc会返回NULLreturn 1;}for (i = 0; i < 10; i++)*(arr + i) = i; //放⼊数据 0 (9)for (i = 0; i < 10; i++)printf("%d ",*(arr + i));//记得释放所开辟的空间free(arr);return 0;}⼆、callocvoid* calloc (size_t num, size_t** size );返回类型:与malloc函数是⼀样的,就不在多说了。
c++语言中的动态内存分配原理
文章标题:深入探讨C++语言中的动态内存分配原理一、动态内存分配的定义和概念在C++程序中,动态内存分配是指程序在运行时,根据需要动态地分配内存空间。
这种分配方式与静态内存分配不同,静态内存分配是在编译时确定内存大小,而动态内存分配可以根据程序实际运行情况动态调整内存大小。
二、动态内存分配的使用场景1. 动态分配内存可以用于解决程序中对内存空间大小不确定的情况。
比如在读取未知长度的文件内容时,可以使用动态内存分配来保存数据。
2. 动态内存分配也常用于创建动态数据结构。
比如链表、树等数据结构,由于元素数量不固定,需要动态分配内存来存储数据。
3. 在函数调用中,有时候需要在函数内部动态分配内存来存储临时数据。
动态内存分配可以解决这类问题。
三、动态内存分配的原理C++中的动态内存分配由new和delete运算符来实现。
new运算符用于在堆上分配一块内存,delete运算符用于释放这块内存。
内存分配的原理主要分为以下几个步骤:1. 当程序执行到new运算符时,首先会调用operator new函数,该函数会在堆上寻找一块合适大小的内存块。
2. 如果找到合适大小的内存块,operator new函数将返回这块内存的位置区域,并调用构造函数来初始化这块内存。
3. 如果堆上没有足够大小的内存块,operator new函数会调用malloc函数来向操作系统申请一块足够大小的内存空间。
4. 当程序执行到delete运算符时,会调用operator delete函数,该函数会释放该块内存,并调用析构函数来释放内存中的资源。
四、动态内存分配的风险和注意事项1. 内存泄漏:由于程序员忘记释放动态分配的内存,导致一直占用内存而不释放,最终导致内存泄漏。
2. 内存重复释放:如果对同一块内存重复调用delete运算符,会导致程序崩溃。
3. 内存碎片:频繁地动态分配和释放内存会导致内存碎片,降低内存使用效率。
个人观点和理解:动态内存分配在C++程序中有着重要的作用,可以灵活地分配和释放内存,解决了静态内存分配无法满足的情况。
C语言动态内存分配的详解及实例
C语⾔动态内存分配的详解及实例1. 动态内存分配的意义(1)C 语⾔中的⼀切操作都是基于内存的。
(2)变量和数组都是内存的别名。
①内存分配由编译器在编译期间决定②定义数组的时候必须指定数组长度③数组长度是在编译期就必须确定的(3)但是程序运⾏的过程中,可能需要使⽤⼀些额外的内存空间2. malloc 和 free 函数(1)malloc 和 free ⽤于执⾏动态内存分配的释放(2)malloc 所分配的是⼀块连续的内存(3)malloc 以字节为单位,并且返回值不带任何的类型信息:void* malloc(size_t size);(4)free ⽤于将动态内存归还系统:void free(void* pointer);(5)_msize(void* pointer)可以获取 malloc 出来的内存空间⼤⼩3. 使⽤ malloc 和 free 需要注意的地⽅(1)malloc 和 free 是库函数,⽽不是系统调⽤(2)malloc 实际分配的内存可能有会⽐请求的多,但不能依赖于不同平台下的 malloc ⾏为。
(3)当请求的动态内存⽆法满⾜时,malloc 返回 NULL(4)当 free 的参数为 NULL 时,函数直接返回malloc(0)返回什么?#include <stdio.h>#include <malloc.h>int main(){int i=10;int* p= NULL;for(i=0;i<100;i++){//注意,malloc(0)会返回⼀个有效的内存地址,⼤⼩为1//但我们不能依赖编译器的这种⾏为来使⽤这个字节的空间!p = (int*)malloc(i);printf("%d ",_msize(p));//返回malloc出来的内存空间⼤⼩free(p);}return 0;}内存泄漏检测模块mleak.h#ifndef _MLEAK_H_#define _MLEAK_H_#include <stdio.h>#include <malloc.h>#define MALLOC(n) mallocEx(n, __FILE__, __LINE__)#define FREE(p) freeEx(p)void* mallocEx(size_t n, const char* file, const line);void freeEx(void* p);void PRINT_LEAK_INFO();#endifmleak.c复制代码#include "mleak.h"#define SIZE 256//动态内存申请参数结构体typedef struct{void* pointer;//申请到的内存地址int size; //内存块⼤⼩const char* file; //⽂件名int line; //⽂件⾏号}MItem;static MItem g_record[SIZE]; //记录每个动态内存申请的操作void* mallocEx(size_t n, const char* file, const line){int i = 0;void* ret = malloc(n);//动态内存申请if(ret != NULL){//申请成功,则记录下来//遍历全局数组,记录此次操作for(i = 0; i< SIZE; i++){//查找位置if(g_record[i].pointer == NULL){g_record[i].pointer = ret;g_record[i].size = n;g_record[i].file = file;g_record[i].line = line;break;}}}return ret;}void freeEx(void* p){if(p != NULL){int i = 0;//遍历全局数组,释放内存空间,并清除操作记录for(i = 0; i< SIZE; i++){if(g_record[i].pointer == p){g_record[i].pointer = NULL;g_record[i].size = 0;g_record[i].file = NULL;g_record[i].line = 0;free(p);break;}}}}void PRINT_LEAK_INFO(){int i = 0;printf("Potenital Memory Leak Info:\n");//遍历全局数组,打印未释放的空间的申请记录for(i = 0; i< SIZE; i++){//查找位置if(g_record[i].pointer != NULL){printf("Address:%p, size:%d, Location:%s:%d\n",g_record[i].pointer,g_record[i].size,g_record[i].file,g_record[i].line);}}}testc.#include <stdio.h>#include "mleak.h"void f(){//没释放,会造成内存泄漏!MALLOC(100);}int main(){int* p = (int*)MALLOC(3 * sizeof(int));f();p[0] = 1;p[1] = 2;p[2] = 3;FREE(p);PRINT_LEAK_INFO();return 0;}/*输出结果:E:\Study>gcc test.c mleak.cE:\Study>a.exePotenital Memory Leak Info:Address:00602ED8, size:100, Location:38-1.c:7*/4. calloc 和 realloc 函数(1)malloc 的同胞兄弟:void* calloc(size_t num, size_t size);void* realloc(void* pointer,size_t new_size);(2)calloc 参数表⽰要返回 num 个某种类型(如 sizeof(int))⼤⼩的内存空间。
内存动态分配算法
内存动态分配算法内存动态分配算法是计算机科学中的一个重要问题,它涉及到在程序运行时动态地分配内存空间,以便为不同的数据和函数提供足够的空间。
本文将介绍内存动态分配算法的背景、基本原理以及一些重要的算法。
内存动态分配算法的重要性在程序运行时,需要使用不同的数据和函数,而这些数据和函数可能会有不同的大小。
传统的静态分配算法只能为每个数据和函数提供固定的内存空间,这样当数据和函数的大小发生变化时,就需要进行重新分配,这样就会导致性能的下降。
内存动态分配算法可以为不同的数据和函数动态地分配足够的内存空间,以满足其不同的需求,因此可以提高程序的性能。
内存动态分配算法的基本原理内存动态分配算法可以分为两个主要步骤:分配和释放。
在分配过程中,需要选择适当的数据和函数,并计算出它们需要的内存空间大小。
然后,动态分配算法会根据程序中定义的规则,动态地为这些数据和函数分配足够的内存空间,并将其存储在相应的内存区域中。
在释放过程中,动态分配算法会检查这些数据和函数是否被使用,如果没有被使用,就会释放这些内存空间,以便再次被请求。
内存动态分配算法的算法复杂度内存动态分配算法的复杂度可以分为两个方面:时间复杂度和空间复杂度。
时间复杂度是指在分配和释放数据和函数时所需要的时间。
动态分配算法需要计算出数据和函数的大小,以及分配和释放内存空间所需的时间。
由于内存空间是动态分配的,因此算法需要考虑所有可能的情况,以确保在所有情况下都能够提供足够的内存空间。
这会增加算法的计算复杂度。
空间复杂度是指在分配和释放数据和函数时所需的内存空间。
动态分配算法需要为每个数据和函数分配足够的内存空间,以满足其需求。
在分配内存空间时,算法需要考虑数据和函数的边界情况,以确保在所有情况下都能够分配足够的内存空间。
在释放内存空间时,算法需要检查数据和函数是否被使用,如果没有被使用,就会释放这些内存空间。
因此,算法需要保持一个记录所有内存空间分配和释放的数据结构,以便在释放内存空间时可以正确地释放内存空间。
C语言动态内存分配与释放
C语言动态内存分配与释放C语言是一种功能强大的编程语言,在开发过程中,动态内存分配和释放是非常重要的概念。
动态内存分配允许程序在运行时分配所需的内存空间,而动态内存释放则可以在不再需要时返回内存给操作系统。
本文将介绍C语言中的动态内存分配和释放的原理、方法和技巧。
1. 动态内存分配的原理和方法动态内存分配是通过使用C语言提供的函数来实现的,其中最常用的函数是malloc和calloc。
这两个函数都属于stdlib.h头文件,并且可以用于分配指定大小的内存空间。
1.1 malloc函数malloc函数用于在堆上动态分配指定字节数的内存空间,并返回一个指向分配内存块的指针。
它的函数原型如下:```cvoid* malloc(size_t size);```其中,size_t是一个无符号整数类型,用于表示要分配的内存的大小。
malloc函数返回的指针可以通过强制类型转换为任何类型的指针。
1.2 calloc函数calloc函数也用于在堆上动态分配内存空间,但与malloc函数不同的是,calloc在分配内存的同时,会将内存空间的所有字节初始化为零。
它的函数原型如下:```cvoid* calloc(size_t num, size_t size);```其中,num表示要分配的元素个数,size表示每个元素的大小。
calloc函数返回的指针也可以通过强制类型转换为任何类型的指针。
2. 动态内存释放的原理和方法动态内存释放是通过使用C语言提供的函数来实现的,其中最常用的函数是free。
free函数用于释放之前通过malloc或calloc函数分配的内存空间,并将此内存返回给操作系统。
2.1 free函数free函数的函数原型如下:```cvoid free(void *ptr);```其中,ptr是之前通过malloc或calloc分配的内存块的指针。
一旦释放了内存块,就不能再访问该内存块以及其相关内容,否则可能导致程序崩溃或不可预料的结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这样函数结束后该变量仍然
存在。
average 81 aver1静态
&aver1 aver
2020/4/13
例2 程序代码
Hale Waihona Puke float *average(int n)
void main( )
{ int i; float s, *aver, sum=0;
{ int n;
static float aver1;
例: int * fun ( int a , int b ) { 函数体 ; }
2020/4/13
6.2.2 返回指针值的函数
例2 求某班成绩的平均分 要求用返回指针值的函数实现
分析:
main
通过函数average的返回 &aver1
值得到保存平均分变量的地
p
址, 进而得到平均分, 函数中
将平均分变量定义成静态的,
必须将数组定义的足够大! 我们希望在输入n后,根据实际
int a[60]; int n, i;
的人数定义一个动态数组,这样 不会浪费存储空间
scanf("%d", &n);
for(i=0; i<n; i++) scanf("%d", &a[i]); 如果输入的n较小(15),那么数组 有多数以上的存储空间被浪费了
2020/4/13
6.6.2 动态内存分配和释放函数
2. calloc( )函数 例: float *p=NULL; p=(float *) calloc (10, sizeof(float));
申请10个连续的float型的存储单元, 并将其首地址赋给float型的 指针变量, 该存储空间总的字节数为10×sizeof(float)
2020/4/13
6.6.2 动态内存分配和释放函数
ANSI C标准定义了3个动态内存分配函数 需要#include "stdlib.h"
1. malloc( )函数 函数原型:void *malloc( unsigned int size);
作用: 在内存开辟一个长度为 size 个字节的连续的存储空间, 返回一个指向该存储区首地址的指针,若系统不能提供足够 的内存单元(分配失败), 函数将返回空指针NULL 说明: void * 是一种指针类型, 称为无类型指针, 常用来说明其基类 型未知的指针, 即声明一个指针变量, 但不指定它指向哪一种 具体类型的数据
2020/4/13
2020/4/13
动态数组的实现
2020/4/13
6.6.2 动态内存分配和释放函数
➢使用malloc函数时, 必须用强制类型转换将
返回的指针值转换回所需要的数据类型, 然后
再进行赋值操作
定义指针变量通常将
int *p=NULL;
其初始化为空指针
double *q=NULL; 申请一个长度为4个字节的存储空间,
p= (int *) malloc (4);
作用: 释放动态申请的由指针变量p所指向的存储空间, 该函数无返回值 说明: ①参数p的值不是任意的地址, 必须是程序中执行malloc或 calloc函数所返回的地址 ② p是普通指针(void *), 但调用free函数时不需要进行强制 类型转换, 计算机系统会自动转换 ③该函数执行后, 将指针p所指向的存储空间交还给系统, 系统可再重新分配
2020/4/13
6.6.2 动态内存分配和释放函数
2. calloc( )函数 函数原型: void *calloc(unsigned int num,unsigned int size);
作用: 给若干同一类型的数据项分配连续的存储空间, 其中每 个数据项的长度单位为字节, 若函数调用成功, 返回一个指向 该存储区的首地址, 若函数调用失败返回空指针NULL 说明: 参数num表示向系统申请的存储空间的数量 参数size表示每个存储空间所占的字节数
sum=sum+s;
}
}
aver1=sum/n;
return(aver);
}
2020/4/13
6.6 指针与动态内存分配
动态内存分配(Dynamic Memory Allocation) 在程序运行时为程序分配内存的一种方法
什么时候需要使用动态内存分配?
例: 计算某班英语成绩的平均分,要求保存每个学生的成绩,而学生 人数由键盘输入
显然,用calloc( )函数开辟的存储空间相当于一个一维数组, 第1个参数决定了一维数组的大小, 第2个参数决定了数组元素 的类型, 函数的返回值就是数组的首地址
2020/4/13
6.6.2 动态内存分配和释放函数
3. free( )函数 函数原型 : void free( void *p );
第7讲 动态分配内存
本讲内容: (1)返回指针值的函数 (2)动态内存分配函数 (3)动态数组的实现
2020/4/13
6.2.2 返回指针值的函数
函数的返回值可以是一个指针类型的数据(即地址) 返回指针值函数的定义格式: 函数类型 * 函数名( 形参列表 ) { 函数体; }
说明:定义一个返回指针值的函数与定义普通函数的格式基本 类似,只是在函数名前加 * , 表明该函数返回一个指针值
float *p;
aver=&aver1;
静态局部变量 printf("input n:");
for(i=1; i<=n; i++)
scanf("%d",&n);
{ printf("input s:");
p=average(n);
scanf("%f", &s);
printf("ave=%6.2f, ", *p);
int *p=NULL;
double *q=NULL;
p= (int *) malloc (4);
q= (double *) malloc ( sizeof(double) );
*p=36;
*q=45.8;
p 0x0N0U37L1L000
36
0x00371000
q 0x0N0U37L1L048
45.8 0x00371048
并将其首地址赋给int型的指针变量, 则该空间可存放int型数据
q= (double *) malloc ( sizeof(double) );
*p=36;
强制类型转换
*q=45.8;
如果不知道某种类型数据 所占内存空间的字节数, 可用sizeof( )进行计算
2020/4/13
6.6.2 动态内存分配和释放函数