c语言内存管路函数 c语言中的内存指什么

数据结构基础之动态内存分配(malloc)C语言提供了四个基本的动态内存管理(内存分配与释放)函数,这些函数的原型包含在stdlib.h头文件里 。
它们分别是:
1.malloc()/free()函数
2.calloc()函数
3.realloc()函数
malloc的全称是memory allocation,中文叫动态内存分配 , 用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,一般需和free函数配对使用 。
本篇只对malloc进行讲解
malloc()函数在堆中申请分配一个大小为size个字节的连续内存空间 , 若成功分配,则返回一个指向 所分配空间起始地址 的指针 , 否则返回空指针(NULL) 。
free()函数用来释放已分配的内存空间,参数p是待释放的内存空间的首指针
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函数用法>?C语言中malloc是动态内存分配函数 。
函数原型:void *malloc(unsigned int num_bytes) 。
参数:num_bytes 是无符号整型,用于表示分配的字节数 。
注意:当内存不再使用时 , 应使用free()函数将内存块释放 。函数返回的指针一定要适当对齐,使其可以用于任何数据对象 。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针 , 因此必要时要进行类型转换 。
实现malloc的方法:
首先我们要确定所采用的数据结构 。一个简单可行方案是将堆内存空间以块的形式组织起来 , 每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等) 。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址。
关于C语言中函数调用时内存管理方面的问题 。一般情况下C里能造成你这种效果的唯一可能就是 malloc之类申请的内存没用free之类释放 。非一般情况指你用更底层的方法(比如Windows得HeapAlloc之类)申请内存来着
----
生化的基本原理我倒是还懂的,并且我坚信就算小学没上过自然课的程序员也能看出来你的问题出在哪儿|||
例举两个c语言中申请内存空间的函数上面那个,你貌似不懂耶
看好了
malloc
原型:extern void *malloc(unsigned int num_bytes);
用法:#include alloc.h
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL 。
当内存不再使用时,应使用free()函数将内存块释放 。
举例:
// malloc.c
#include syslib.h
#include alloc.h
main()
{
char *p;
clrscr();// clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);
getchar();
return 0;
}
free
原型:extern void free(void *p);
用法:#include alloc.h
功能:释放指针p所指向的的内存空间 。
说明:p所指向的内存空间必须是用calloc,malloc,realloc所分配的内存 。
如果p为NULL或指向不存在的内存块则不做任何操作 。
举例:
// free.c
#include syslib.h
#include alloc.h
main()
{
char *p;
clrscr();// clear screen
textmode(0x00);
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
getchar();
free(p);// release memory to reuse it
p=(char *)calloc(100,1);
if(p)
printf("Memory Reallocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);// release memory at program end
getchar();
return 0;
}
为什么很多人不喜欢c,c,因为管理内存的一部分任何必须由程序员自己管理,不然很容易内存泄露,现在有很多检查内存泄露的软件比较常用的有(boundchecker)有兴趣的可以下个试一下自己的程序 , 你会发现自己好可怕 。malloc free使用一般有几个原则(自己总结的,不一定正确 , 但很实用)
1 ,malloc free必须配套使用,并且尽可能逆序 。
2 ,谁malloc的谁free
3,能够不动态分配的尽量不动态分配,动态分配是很费时间的 , 而且存在一定的风险 。
很多人喜欢这样写程序:
type * f()
{
type *t = (type*)malloc ( sizeof(type));
.
.
return t ;
}
这个肯定会出问题,一般象这种情况,一般声明f(type* t),谁调用它谁为t分配空间,谁来释放它的空间 。不过很有意思的是,在有写系统函数的会这样.如(char* asctime() ,它返回一个表示时间的字符指针 , 但是并不要求你释放,你也没有办法释放,但是我可以肯定它这个串肯定不是在堆区分配的)
free的顺序也很重要,很多时候free的时候会出现空指针的引用 , 不足为齐 。有人提议free(t);t = NULL ;这种用法,有一定的道理 , 当你free一块空间后,操作系统不会立即回收,所以在你再次用t的时候可能还是可以用的,t就成了个野指针,而将其t = NULL后,对t的引用会出问题 。
c语言中 , malloc和free是什么意思?属于内存管理的两个函数,malloc是申请内存的,free是释放内存的 。
1、malloc一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
也可以在sizeof前面加上一个'n*'这就成了一个动态分配数组的方法 。
2、free一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
free(t);
这样t所指的空间就被释放掉了 。
扩展资料:
malloc函数定义
其函数原型为void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间 。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置 。
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定) , 否则返回空指针NULL 。当内存不再使用时,应使用free()函数将内存块释放 。
参考资料来源:百度百科-malloc函数
参考资料来源:百度百科-free()
【c语言内存管路函数 c语言中的内存指什么】c语言内存管路函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言中的内存指什么、c语言内存管路函数的信息别忘了在本站进行查找喔 。

    推荐阅读