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

malloc分配内存是堆还是栈

  • 内存
  • 2024-05-30 14:19:34
  • 5185

一、关于malloc函数的无法设置intnum[max]。。
不存在动态数组这样的东西。定义数组时,数组大小必须保持不变。
malloc在堆中分配内存。就这些。
----------------------------------------------------------
好的,好的。。对于我们这些常用编译器是的人来说,它并不能完美支持C/C++特性,VLA确实不在考虑范围之内。。。。之后。。当g++处理VLA时,它只是将ESP向下移动而不检测长度,因此可能导致堆栈溢出情况。然后数组的内存在栈中分配,new/malloc的内存在堆中分配。。因此,从malloc调用内存时,多了一条Mov指令:
Memoryfromnew:*p=0;实现:
movecx,dwordptr[ebp-4]
movdwordptr[ecx],0
直接使用数组:pp[0]=0;执行:
movdwordptr[ebp-194h],0
所以会造成执行速度的差异。
关于malloc的含义,如上所述,必须手动发出。换句话说,内存块的生命周期是由它自己控制的。。考虑一些API函数集。。。。好的。如果您使用支持VLA的编译器,那么您可能不在Windows环境中。。。然后想象一个套接字程序。。当调用socket()函数获取一个SOCKET时,与这个SOCKET关联的一些对象直到调用closesocket()函数后才会被释放。。过了这个生命周期,VLA
就有些难以控制了。
接下来是链表。除了简单的单向和双向链表之外,其他稍微复杂的结构,例如树结构,都很难用VLA来实现。
此外,所谓的VLA可变长度仅在编译期间改变,而不是在运行时改变。这意味着,VLA一旦确定其大小,就无法再更改。。那么,在某些需要频繁改变长度的情况下,VLA显然不如malloc方便,后者可以自己控制生命周期。甚至连更换的可能性都没有。
以上。。。这就是我目前所想的。。


二、C语言malloc()函数分配内存空间尺寸的问题

这个问题必须从栈开始。程序通常分为三段:代码段、数据段(静态数据)和堆栈段。堆栈段存储程序变量、程序传递的参数等(动态分配的变量存储在堆上,静态分配的变量存储在堆栈上)。堆栈的增长如下:

程序在运行时预先分配堆栈空间,因此您的问题不一定会更改不应更改的部分。修改最初它可能只是空的。


让我们回到malloc函数。malloc主要负责分配空间并返回空间的首地址。那么为什么请求的空间是0却可以存储7个字符呢?这是因为C中的指针不检查数组越界问题。如果你不相信,你可以这样做:chach[5],然后读写ch[6](printf或scanf)。,并且不会报错。但是当我们使用它的时候,我们不应该越界使用它,因为这样的程序是非常危险的。想象一下,如果在边界之外使用的地址原来是操作系统地址,那么一旦更改它。,系统就会崩溃。同时,这种C语言机制被黑客广泛用于缓冲区溢出攻击,所以不仅不能使用指针越界,而且要时刻考虑指针(数组)是否越界,以提高程序安全性。


希望这对您有用。。。


三、malloc()函数比数组有什么优势.Malloc在堆空间上动态分配内存。如果知道数组的大小,请使用数组。该数组位于堆栈空间中。默认最大空间大小为1MB。快速高效!不会产生内存碎片。malloc一般用在不知道有多大或者需要动态分配的时候!一般为了效率,比如读取一个文件,如果不知道文件大小,我会先预留一个估计比文件大小大的数组来接收,而不是动态分配!