C语言-动态分配内存 malloc & free
需要用一个数组来保存用户的输入,但是却不知道用户会输入多少条数据。
(1) 如果设一个太大的数组,则显得浪费内存
(2) 如果设得太小,又怕不够
问题:如何做到恰好够用、又一点不浪费呢?
系统中存在一个内存管理器(MM, Memory Manager),它负责管理一堆闲置内存。它被设计用于解决此类问题。
MM提供的服务:应用程序可以向MM申请(借出)一块指定大小的内存,用完之后再释放(还回)。
应用程序在使用malloc时,要把返回值转换成目标类型。
这块内存和数组没有本质区别,用法完全相同。
需要先计算需要多少字节的内存空间
数组举例子:
释放的时候需要注意, 因为在for循环执行之后,p的地址往前移动了10, 所以需要减去10, 然后再释放p,不然会有问题
// 当销毁时只需要free一次,malloc了几个字节就会free几个字节,和char类型还是int类型无关
free(p);
在一个函数中动态分配的内存,在另一个函数中操作这块内存
(1) MM是一个系统级的东西,所有的应用程序都向同一个MM申请内存。
(2) 何为借出?实际上,在内存被借出时,MM只是把它管理的内存标记了一下,表示该段内存已经被占用。比如,它把每一段被占用的内存给记录下来(首地址,长度)
(p0,n0) (p1, n1) (p2, n2) ...
(3) MM非常慷慨:①只要有人 malloc ,它都同意借出 ②你不归还,它永远不会主动要求你 free 。
(4) MM管理的内存区域称为“堆”Heap
这意味着,用户程序应该自觉得及时 free ,以便不耽误别的应用程序的使用。如果有个应用程序不停地 malloc ,而不 free ,那最终会用光MM的内存。当MM没有更多闲置内存时, malloc 返回 NULL ,表示内存已经用完。
再次重申: 应用程序在malloc之后,应该尽早free !
使用原则:需要的时候再申请,不需要的时候立即释放
实际上,MM对借出的内存块进行标识
(p0, n0) (p1, n1) (p2, n2) ...
它内部已经保证任意两块内存不会“交叠”,即不会重叠,不会把一块内存同时借给两个应用程序使用。
所以,每块内存的首地址都是不同的,在 free 的时候只需要指明首地址即可。
对象指的一块内存
示例:用Citizen表示一个市民,用Car表示一个辆车。他起初没有车,但未来可能有一辆车。
怎么样才算“及时”? “不及时”会怎样?
MM里可用的内存是有限的,你用完了就得尽快还,因为别的应用程序也需要MM的内存。
只借不还,积累到一定程度,MM没有更多内存可用,于是malloc返回NULL。
要还就得全还,否则MM那边处理不了
原因是:MM可能此时没有闲置内存可用。(虽然这种情况一般不会发生)
free之后,该内存交还给MM,该内存不再可用(失效)
不一定要在相同的函数里释放,在应用程序的任意一个角落释放都是有效的。
也就是说:这一块内存被malloc出来之后,完全交给你处置
功能:将 s 中当前位置后面的 n 个字节 (typedef unsigned int size_t )用 ch 替换并返回 s
参数:
参数:
功能:由 src 所指内存区域复制 n 个字节到 dest 所指内存区域。
memmove() 功能用法和 memcpy()) 一样,区别在于: dest
和 src 所指的内存空间重叠时, memmove() 仍然能处理,不过执行效率比 memcpy() 低一些
C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等...
先举个例子:某用户需要一个将任意多个整数按大小排序的程序。(在计算机文件夹中,当文件很多时经常用到排序)1。若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如果定义的数组还不够大,不就不能满足需求了?2。如果用动态分配,就解决上述问题了。当...
怎么查看动态分配内存空间的大小(c语言)。
如果分配失败则返货NULL nSize一般使用 sizeof(类型A)*N 的计算方式获取大小。意思为:为分配n个类型A所占空间的大小。获取的指针地址需要强制转换为指定类型 例如:int *p = (int*)malloc(sizeof(int)*100);使用malloc动态分配的内存空间需要使用free函数手动释放。
C语言动态内存函数分配问题
需要先找到队伍的领头人,领头的人只在你申请的时候出现一次,后面,你就找不到他了,怎么办?你把他电话给P吧,P可以找到他。呵呵。如果还是不理解,那就不要理解了,建议去吧队列的方式,用指针和动态分配内存的方式实现一次,就知道了,不能照着书本抄,全部代码要自己写出来,就肯定理解了。
C语言中二维数组如何申请动态分配内存
1、使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小。2、例程,分配3行4列二维数组:include <stdio.h>#include <malloc.h>int main(){ int **a; int i, j; a = (int**)malloc(sizeof(int*)*3);\/\/为二维数组分配3行 for (i = 0; i < 3; ++i){...
C语言动态内存分配的疑问
而二维的指针,即指针的指针,是定义了又一个指针,指向的是指针变量,例如 char **str 的意思是:str变量是指针的指针,str变量存储的是一个指向字符串的指针变量的地址。要想直观理解,建议看书,书上一般会有内存示意图,非常直观。2、sizeof是关键字,也可以说是运算符,不是函数,sizeof(int)...
c语言中的动态内存分配函数malloc, calloc, realloc分别是那几个单词...
malloc应该就是memory allocate realloc就是加个re前缀 calloc有人说是complex也有说是clear的,与malloc区别就是多了清0操作
C语言,为什么动态内存分配申请后,还要再释放?
2. free()的用处在于实时回收内存。如果你的程序很简单,那么你不写free()也没关系,在你的程序结束之前你不会用掉很多内存,不会降低系统性能;而你的程序结束之后,操作系统会替你完成这个工作。但你开始开发大型程序之后就会发现,不写free()的后果是很严重的。很可能你在程序中要重复10k次分配10M...
C语言 动态内存分配!
scanf("%d",p+i);是几个意思 这样得到的分数会从第二个字节开始写入数组,写到最后全部都不是整形变量元素
c语言程序设计(关于动态内存分配)问题。高手进
include<malloc.h> include<stdlib.h> void main(){ int n,i,k,m,sum=0,*p,hign_score,low_score; \/\/定义常量 float ave_score;printf("please input the number of the students:");scanf("%d",&n);p=(int*)malloc(n*sizeof(int)); \/\/动态内存分配 if(p==NULL){ printf...
c语言 动态内存分配技术存储数字,并求它们平均值
include <stdio.h> include include <stdlib.h> int main(){ int n,*p,i,sum=0;scanf("%d",&n);p=(int *)malloc(sizeof(int)*n);srand(time(NULL));for(i=0;i<n;i++){ (p+i)=rand()%9999;sum+=*(p+i);} free(p);printf("sum=%d,avg=%d",sum,sum\/n);return 0...
源试头孢: C语言中malloc是动态内存分配函数. 函数原型:void *malloc(unsigned int num_bytes); 参数:num_bytes 是无符号整型,用于表示分配的字节数. 返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返...
渭源县17691844291: c语言malloc如何实现动态分配 - ?
源试头孢: 动态的意思是和静态对比的.那我们先看一下静态是什么.当我们写一个程序的时候要定义一个放置名字的数组.中国人的名字很短最长也就是6,7个字所以在程序一开始的时候定义一个数组像这样char name[10];这样足够放置名字了.这个定义就是...
渭源县17691844291: C语言中分配内存 - ?
源试头孢: 要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数 1、malloc函数 malloc函数的原型为:void *malloc (u igned int size) 其作用是在内存的动态存储区中分配一个长度为size的连续空间.其参数是一个无符号整形数,返...
渭源县17691844291: c语言malloc函数 - ?
源试头孢: 首先你要明确是指针的概念:很明确的定义就是存放地址的变量.请注意这个定义,没有任何其他的约束. malloc分配空间,是指系统按照的你程序在内存堆栈中分配一段内存给你,而该内存段的首地址赋值给你的p,这是基本的指针概念,为...
渭源县17691844291: C语言:动态内存分配 - ?
源试头孢: 1.p1=(int *)malloc(10*sizeof(int)); //malloc 函数将会在动态存储区中分配一个长度为 10*sizeof(int)的 <连续> 空间. 而且p1的值是 分配域的起始地址;这就有一点像数组名了.2.例如 int temp[10]; int *ptemp; ptemp=temp; //得到数组的首地址.这样 ptemp 就可以 引用 数组的元素了.比如 ptemp[i]; 当然 这是 固定分配内存的.3.scanf("%d",&p1[btc]); 和 printf("%d",p1[btc]); 这两个函数 中 p1 的作用 就 是相当于数组名. 引用动态的数组.
渭源县17691844291: c语言中的malloc语法 - ?
源试头孢: 动态分配内存空间函数: p=(分配类型 *)malloc(分配元素个数 *sizeof(分配类型)) 如果成功,则返回该空间首地址,该空间没有初始化,如果失败,则返回0 实例: char p; p=(*char)malloc(100*sizeof(char))
渭源县17691844291: c语言中什么是动态分配内存? - ?
源试头孢: c语言用函数malloc动态分配内存的,要用到指针,释放内存是free指针 malloc 原型:extern void *malloc(unsigned int num_bytes); 用法:#include <malloc.h> 或#include<stdlib.h> 功能:用于向内存申请空间,分配长度为num_bytes字节的内存...
渭源县17691844291: C语言中怎么使用malloc函数? - ?
源试头孢: malloc只是动态分配内存存储空间.void *malloc(long nBytes):该函数分配了nBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL) 例如:char *Ptr = NULL;Ptr = (char *)malloc(100 * sizeof(char)); 就是这样!当然,具体情况要具体分析以及具体解决.比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了
渭源县17691844291: 关于c语言动态内存分配的问题! - ?
源试头孢: 要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数.(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”)1.malloc函数 函数原型为void *malloc(unsigned int size);在内存的动态存储...
渭源县17691844291: c语言字符串数组动态分配内存的问题(malloc()/calloc()) - ?
源试头孢:str=(char **)calloc(m, sizeof(char *));//分配m个char指针 for(int i=0;i{str[i] = calloc(1, 100 * sizeof(char));//为每个char指针分配100个char }