C 在运行时提供数组大小和动态内存分配之间的区别

C 在运行时提供数组大小和动态内存分配之间的区别,c,C,在下面的代码中,我提供了运行时数组的大小 #include <stdio.h> int main() { int i; scanf("%d",&i); int a[i]; } #包括 int main() { int i; scanf(“%d”、&i); int a[i]; } 请告诉我上面的代码与使用malloc()的代码之间的区别。 我知道数组存储在堆栈上,动态内存(malloc,calloc等)在堆上。 那么,我的代码是否与malloc类似

在下面的代码中,我提供了运行时数组的大小

#include <stdio.h>

int main()
{
    int i;
    scanf("%d",&i);
    int a[i];
}
#包括
int main()
{
int i;
scanf(“%d”、&i);
int a[i];
}
请告诉我上面的代码与使用
malloc()
的代码之间的区别。 我知道数组存储在堆栈上,动态内存(
malloc
calloc
等)在堆上。
那么,我的代码是否与malloc类似?如果没有,请解释。

上述语句适用于C99,但使用这种方法有局限性:

inta[i]
是可变长度数组,而不是内存 已分配,因此它将存储在堆栈上,而不是它所做的“堆” 在malloc的情况下,“因此当有人进入 MAX_INT和堆栈内存限制非常小(例如:嵌入式 然后可能发生堆栈损坏


除了代码使用VLA之外,VLA还使用:

  • C99之前不存在
  • 作为C99中的一项新功能引入
  • 现在是自C11以来的可选功能

不同之处在于,当自动数组(VLA或静态大小的数组)超出作用域时,它们会自动释放,因此您无法从函数返回它们,而动态分配的数组会一直保留,直到它们被显式释放为止—如果您不希望内存泄漏,这将在丢失指向它们的指针之前发生。

数组
a
是可变长度数组或VLA,可能存储在堆栈上,就像
i
存储在堆栈上一样。此外,除了从定义数组的块(函数)中退出之外,没有其他方法可以“释放”该数组。如果您使用了
malloc()
等,那么您就有了一个指针,并且您需要
free()
完成分配的数组。如果代码周围有一个循环,那么每次迭代都需要
free()
;有了VLA,你就不必担心自由了。VLA是C99的无条件部分和C11的可选部分。但据我所知,C11和C99可以支持这一点。我只是想知道动态内存分配和声明数组的可变长度之间的区别。您了解从哪里分配内存的区别吗?普通数组和VLA将从堆栈中分配,而动态分配将从堆中保留内存。(尽管人们对这些术语的使用存在争议,但它们通常用于区分)通常情况下,堆栈比堆小得多-可用堆栈大小通常为1-8 MiB total,而堆大小通常可以包含多个GiB total(尤其是64位系统)。因此,您可以通过
malloc()
等方式分配比使用VLA机制大得多的数组。