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

c内存分配有哪几种方式

  • 内存
  • 2024-09-04 04:49:29
  • 8939

一、C语言问题:内存的分配方式有哪几种?

1静态存储区域分配

内存分配在程序编译之前完成,并且存在于程序的运行过程中,例如全局变量、静态变量等。

2栈分配

函数执行时,函数内部的局部变量存储单元。在栈上创建的,这些存储单元会在函数执行结束时自动释放。

3堆分配

堆分配(也称为动态内存分配)。程序在运行时使用malloc或new来申请内存,程序员使用free或delete来释放它动态内存的生存期是由我们决定的。

扩展信息

在堆栈上分配数组

#include

usingnamespaced;

voidmain()

{

int**arr=NULL;//int类型二-维数组

输入,列;

>row;//2

>column;//3

//请在此处编写代码,根据行和列拆分堆栈上的数组字符串

...您的代码..

//给数组元素赋值

for(introwIndex=0;rowIndex

{

for(intcolumnIndex=0;columnIndex

{

arr[rowIndex][columnIndex]=columnIndex+(rowIndex+1)*1000+1;

}

}

//打印每个数组元素

for(rowIndex=0;rowIndex

{

for(intcolumnIndex=0;columnIndex

<{

printf("%d",arr[rowIndex][columnIndex]);

}

printf("\n");

}

}


二、C语言-动态分配内存malloc&free

需要一个数组来存储用户输入,但是我们不知道用户会输入多少条数据。

(1)数组设置太大,会浪费内存
(2)设置太小,不够用

问题:如何做到足够,但又不至于浪费?

系统中有一个内存管理器(MM,MemoryManager),它负责管理一个空闲内存池。它就是为了解决此类问题而设计的。

MM提供的服务:应用程序可以向MM申请(借用)一定大小的内存,使用后释放(归还)。

当应用程序使用malloc时,必须将返回值转换为目标类型。

这个内存和数组没有根本的区别,而且它们的用法是完全一样的。

首先需要计算一下需要多少字节的内存空间

一个数组的例子:

释放的时候需要注意,因为之后for循环执行完毕,p地址已经向前移动了10,所以必须先减10再释放p,否则会有问题

//销毁时只需要释放一次。malloc一些字节后,会释放一些字节,不管是char类型还是int类型
free(p);

在一个函数中动态分配内存,在另一个函数中操作这块内存。function

(1)MM是系统级的东西,所有应用程序都从同一个MM申请内存。

(2)什么是信用?事实上,当内存被借出时,MM只是简单地标记它所管理的内存,表明该内存已经被占用。比如记录每段占用的内存(首地址,长度)
(p0,n0)(p1,n1)(p2,n2)...

(3)MM为非常大方:①只要有人用,就同意借出;②如果你不归还,他们绝不会免费向你索要。

(4)MM管理的内存区域称为Heap

这意味着用户程序必须及时感到空闲,这样才不会滞后于其他应用程序的使用。如果有一个应用程序继续被误用但没有被释放,它最终会耗尽MM内存。当MM没有更多的空闲内存时,malloc返回NULL,表明内存耗尽。

再次强调:malloc后,申请应尽快释放!

使用原则:需要时重新申请,不需要时立即释放

CurrentActive,MM识别借用内存块
(p0,n0)(p1,n1)(p2,n2)...
内部保证每两个内存块不会“重叠”,即也就是说,不会有重叠,一部分内存不会同时被两个应用程序借用

所以在释放时每个块内存的首地址是不同的,只需指定即可。第一个地址。

对象引用的一段内存

示例:用Citizen代表公民,用Machine代表汽车。

什么才算“准时”?

MM中可用的内存是有限的,当你使用它的时候,你应该尽快归还它,因为其他应用程序也需要MM。记忆。

只借不归,积累到一定程度后,MM已经没有更多的可用内存了,所以malloc返回NULL。

如果要返回,必须完整返回,否则MM无法处理

原因是:MM此时可能没有空闲内存可用。(虽然这种情况一般不会出现)

释放后,内存返回给MM,内存不再可用(voided)

一定不能在同一个函数中释放,该发布在应用程序的每个角落都有效。

也就是说:这部分内存被销毁后,就完全留给你随意处置了

功能:将s中当前位置之后的n个字节(typedefunsignedintsize_t)替换为ch并且returns

参数:

参数:

功能:从src指向的内存区域复制n个字节到dest指向的内存区域。

memmove()函数与memcpy相同(区别是:当dest
和src指示的内存空间重叠时,memmove()可以处理,但是执行)。效率比memcpy()低


三、C语言中的动态内存分配的用法举例

函数:它的作用是在内存的动态存储区域中分配一块长度为size的连续空间。它的参数是一个无符号整数,它的返回值是一个指针,指示所分配的持久存储区域的起始地址。

2.释放功能:因为内存空间总是有限的,所以不能无限制地分配,而且程序必须尽量节省资源,所以当分配的内存区域不使用时,必须将其释放。以便其他变量或程序使用它。这时候我们就要用到free函数了。

函数:其作用是在动态内存存储区域中分配n个连续的大小为length的空间。该函数返回一个指向已分配区域起始位置的指针,如果分配不成功则返回NULL。

扩展信息:

函数运算符:

新运算符

new用于向系统申请动态存储空间,首地址作为运算结果。它的使用模型是:

指针变量=新数据类型;例:

int*p=newint

这条语句的作用是用new从内存中实现一个int类型(4个字节)的变量,并赋值给它的首地址给定指针变量p的变量。

new创建的变量初始值是一个随机值,也可以在用new分配内存时进行初始化。典型用法是:

指示变量=新数据类型(初始值)。

删除

堆内存可以根据需要分配。软件的内存要求可能随时发生变化。有时程序可能无法返回内存,因为需要新分配的空间,并且程序尚未完成运行。这时,必须将之前占用的内存空间释放到堆内存,然后重新分配以供程序的其他部分使用。删除操作符用于释放为新对象分配的内存空间并将其删除。其使用模型为:

删除指针变量

指针变量保留新分配的第一块内存地址

参考:--动态内存分配