当前位置: 代码迷 >> 综合 >> 关于C语言中的动态内存分配基础!关键词malloc、alloc、realloc。
  详细解决方案

关于C语言中的动态内存分配基础!关键词malloc、alloc、realloc。

热度:65   发布时间:2024-01-15 02:08:47.0
  • 20\11\14:初稿。

一、C语言的内存分配区

C语言分配如此多的区域,主要是因为:
一个进程在运行时,代码是根据流程依次执行的,代码只需访问一次,当然跳转或递归时代码会被执行多次,而数据一般都需要访问多次,因此单独开辟空间以便访问和节约空间。

(1) 代码区(text)

代码区包括操作码和要操作的对象(或对象的地址引用),如果是立即数(即具体的数值,如2),将直接包含在代码中;如果是局部数据,将在栈中分配空间,然后引用该数据的地址;

(2) 全局初始化数据区/静态数据区(data)

只初始化一次。在程序编译时,该区域已经被分配好了,这块内存在程序的整个运行期间都存在,当程序结束时,才会被释放。

(3)栈区(stack)

存放函数的参数值和局部变量,由编译器自动分配释放,其操作方式类似于数据结构的栈。其特点是不需要程序员去考虑内存管理的问题,很方便;同时栈的容量很有限,在Linux系统中,栈的容量只有8M,并且当相应的范围结束时(如函数),局部变量就不能再使用。

(4)堆区(heap)

有些操作对象只有在程序运行时才能确定,这样编译器在编译时就无法为他们预先分配空间,只有程序运行时才分配,这就是动态内存分配。堆区就是用于动态内存分配(如malloc的动态内存分配),堆在内存中位于bss区和栈区之间,一般由程序员申请和释放。

二、动态内存分配主要关键词;

(1)主要关键词:

<1>alloca是向栈申请内存,因此无需释放.

<2>malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间.

<3>calloc则将初始化这部分的内存,设置为0.

<4>realloc则对malloc申请的内存进行大小的调整.

<5>申请的内存最终需要通过函数free来释放.
其中三个需要释放的关键字的函数声明:

void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);
void* realloc(void* ptr, unsigned newsize);</

  相关解决方案