尽管我们可以使用可变长度数组,但为什么还需要动态内存分配呢?

时间:2016-05-19 12:30:07

标签: c dynamic malloc heap-memory dynamic-arrays

为什么我们需要动态内存分配,尽管我们可以使用可变长度数组?

我们可以在运行时使用可变长度数组分配动态内存:

unsigned int x;
printf("Enter size:");
scanf("%d",&x);
int arr[x];

我们还可以使用动态内存分配函数之一在运行时分配内存:

unsigned int x,*p;
printf("Enter size:");
scanf("%d",&x);
p = (unsigned int *)malloc(x);

所以,在这两种情况下我们都可以在运行期间分配内存。那么,为什么我们需要动态内存分配,尽管我们可以使用可变长度数组呢? 使用动态内存分配函数而不是数组时,我们可以获得哪些好处?

编辑传递数组的代码:

unsigned int *func(unsigned int *p)
{
   *p=10; // any processing on array

   return p;  // we could return a pointer to an array

}

int main()
{
  unsigned int x,*P;
  printf("Enter size:");
  scanf("%d",&x);
  unsigned int arr[x];

  p = func(arr);
}

3 个答案:

答案 0 :(得分:2)

因为它有不同的用例。

在调用例程中分配它时使用自动内存,并且可以随意将该内存传递给被调用者。但是你永远无法将它归还给来电者。

想象一个使用不透明结构来存储数据的库 - C中的一种OOP.API很可能有这个签名的例程:

void * buildEltOfTypeXX(param1, param2, ...);

创建并初始化不透明结构。在这种情况下,很明显内存必须使用动态分配(malloc)而不是自动,因为你会返回一个悬空指针。使用该模式,调用者将获得内存的所有权,并且在不再需要时将不得不释放它。

答案 1 :(得分:1)

可变长度数组(VLA)中,当你使用int arr[x]时,即使x是动态计算的arr也会存储在栈中,空间有限,这使它不安全。因为你有可能用完空间。所以如果你知道你使用静态数组的大小,否则你会写出不安全的代码。

在这种情况下,我们需要动态内存分配,其中内存存储在堆中,“堆”(大内存池)通常是指由 malloc (C) 和 new 管理的内存(C++) 用于动态内存分配。

否则,VLA 更易于使用,例如在简单的编码竞赛/问题中,您的测试用例大小有限,如果它可以正常工作,那么它很好,否则使用动态分配,我不建议在某些高级编程中使用它(操作系统、浏览器、库、图形、银行应用程序),除非您确定它不会引起问题。也可能与某些编译器不兼容。

可能 this question 也会有帮助。

答案 2 :(得分:0)

因为int arr[x]x是一个变量值,就像你的例子一样,不是一个有效的标准C(或C ++)代码。

至少:对于C ++的标准化版本(C ++ 98,C ++ 03,C ++ 11,C ++ 14)而言,这是真的(如果我没有错) C标准化(C89)。

C99允许使用可变长度数组,但以下(和当前)C11标准使它们成为可选功能。

因此,只有在使用符合C99的编译器时,才能依赖可变长度(未分配)数组。从不在C ++中。

p.s:抱歉我的英语不好。