C中堆部分与堆栈部分的数组内存分配

Adi*_*idu 5 c dynamic-memory-allocation static-memory-allocation

考虑以下C代码:

#include <stdio.h>
#include<stdlib.h>

int main() {

    int arrSize;

    scanf("%d", &arrSize);

    printf("%d\n",arrSize);

    int *dynArr = (int *)malloc(sizeof(int)*arrSize);

    int arr1[arrSize];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,arrSize是作为用户输入的数组的大小.以下观察结果是否正确:

i)dynArr是一个动态数组,它在运行时从堆部分分配内存.可以使用realloc函数修改dynArr的大小.

ⅱ).arr1也在运行时分配内存,但不是动态的,即它们的大小无法修改.内存是从堆栈或数据部分分配的.(不确定内存分配的堆或堆栈/数据部分以及原因).

Sto*_*ica 5

i)dynArr是一个动态数组,它在运行时从堆部分分配内存.可以使用realloc函数修改dynArr的大小.

是的,如果realloc能找到足够大的块.虽然从技术上讲,指针不是数组.它指向到所述第一元件阵列.

ⅱ).arr1也在运行时分配内存,但不是动态的,即它们的大小无法修改.内存是从堆栈或数据部分分配的.(不确定内存分配的堆或堆栈/数据部分以及原因).

数组的大小是动态的,它的生命周期不是.它将在main返回时自动回收.可变长度数组通常在调用堆栈上分配.是的,一旦你宣布它就不能改变它的大小.


如果您现在想知道何时使用其中一个,则需要考虑以下几点:

  1. 为调用堆栈保留的内存是有限的(远远超过堆).如果你声明一个巨大的VLA,很容易溢出.

  2. malloc从其返回的内存及其亲属可以比分配它的堆栈帧寿命更长.

  3. 通常,分配VLA可能比分配内存更快malloc.一个是堆栈帧指针的简单进展,而另一个是堆的内存分配器及其逻辑.


use*_*738 2

它从空闲内存存储中分配内存。现在,对于 C 来说,内存中没有所谓的堆和堆栈。这是我们在逻辑上考虑的东西C。(在 C 的实现中)]


我们唯一关心的是我们是否需要一些你想要活着的东西,即使它声明的范围是否结束。

对于堆来说是这样。对于堆栈来说则不是。

在你的情况下

int arr1[arrSize];分配在存储该主函数局部变量的同一帧上。

动态分配

您可以控制这些内存位置的确切大小和生命周期。如果不释放它,您将遇到内存泄漏,这可能会导致您的应用程序崩溃,因为它在某些时候无法分配更多内存。( dynArr)

实际上...

堆是计算机内存中的一个区域,不会为您自动管理,也不会受到 CPU 的严格管理。它是一个更自由浮动的内存区域(并且更大)。要在堆上分配内存,必须使用 malloc() 或 calloc(),它们是内置的 C 函数。

一旦您在堆上分配了内存,您就需要在不再需要该内存时使用 free() 来释放该内存。如果您不这样做,您的程序将出现所谓的内存泄漏。也就是说,堆上的内存仍将被保留(并且不会可供其他进程使用)。

它是计算机内存中的一个特殊区域,用于存储每个函数(包括 main() 函数)创建的临时变量。堆栈是一种“LIFO”(后进先出)数据结构,由 CPU 密切管理和优化。每次函数声明一个新变量时,它都会被“推”到堆栈上。然后,每次函数退出时,该函数压入堆栈的所有变量都会被释放(也就是说,它们被删除)。一旦堆栈变量被释放,该内存区域就可用于其他堆栈变量。

资源