当前位置:首页 » 编程语言 » c语言申请内存

c语言申请内存

发布时间: 2023-03-29 08:43:55

1. 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所指的空间就被释放掉了。

(1)c语言申请内存扩展阅读:

malloc函数定义

其函数原型为void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。

如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

2. c语言内存怎么回收和代码是什么

在C语言中,使用malloc来动态申请内存,申请完后必须释放该空间。如果不手动释放,那么只能等程序运行结束后系统去回收,但在程序运行过程中容易造成内存溢出的问题,所以应该使用free(void*)来手动释放申请的空间,这样可以保证程序的健壮性。案例如下:x0dx0a #include "stdio.h"x0dx0a #include "stdlib.h"x0dx0a #include "string.h"x0dx0a void main()x0dx0a {x0dx0a //申请20个字节空间x0dx0a char *str = (char*)malloc(20);x0dx0a //将空间内容设置为\0x0dx0a memset(str, '\0', 20);x0dx0a //为每个字节空间赋值x0dx0a char *p = str;x0dx0a for (int i = 0; i < 10; i++)x0dx0a {x0dx0a *p++ = 'a' + i;x0dx0a }x0dx0a printf("str=%s\n",str);x0dx0a //释放申请的空间,交回给系统x0dx0a free(str);x0dx0a }x0dx0a运行结果为:x0dx0astr=abcdefghijx0dx0aPress any key to continuex0dx0a x0dx0a这个案例很简单,但也很能说明问题,我想应该对你帮助,呵呵。x0dx0a x0dx0a补充:在C++中,动态申请空间使用new方法(new方法底层调用的其实是malloc方法),释放时使用delete方法(底层调用的是free)。

3. 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() 低一些

4. 例举两个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的引用会出问题。

5. 在C语言中,具有动态申请内存块功能的函数是

给你介绍两个函数吧:
malloc函数 void * malloc(size) 动态内存分配函数,分配size字节的内存,返回的是指向该区域的指针
realloc函数 void * realloc(void * ptr ,size)重新分配内存,将ptr所指的已分配内存块的大小改为size,返回的也是指向该内存区域的指针

另外都包含在<stdlib.h>头文件中

楼主说的就是malloc函数了,这两个函数在数据结构中经常用到的
希望可以帮助你

热点内容
瑞纳自动买哪个配置 发布:2024-11-02 20:18:45 浏览:559
sql复制数据库结构 发布:2024-11-02 20:18:43 浏览:582
yaf编译 发布:2024-11-02 20:06:30 浏览:126
小数除以大数怎么算法 发布:2024-11-02 19:44:59 浏览:810
安卓手机如何重新设置付款密码 发布:2024-11-02 19:31:44 浏览:980
多巴胺3mg静脉注射怎么配置 发布:2024-11-02 19:25:50 浏览:618
源码之城 发布:2024-11-02 19:24:43 浏览:513
国军标环境存储要求 发布:2024-11-02 19:23:04 浏览:107
sql多行转多列 发布:2024-11-02 19:17:52 浏览:119
linuxftp文件夹权限 发布:2024-11-02 19:17:03 浏览:899