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

C 为什么我们需要动态内存分配,尽管我们可以使用可变长度数组?,c,dynamic,malloc,heap-memory,dynamic-arrays,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

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

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

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);
}

因为
int-arr[x]
,当
x
是一个变量值(如示例中所示)时,它不是有效的标准C(或C++)代码

至少:C++ C++ C++ 98、C++ 03、C++ 11、C++ 14以及第一个C++标准化(C89),这是正确的(如果我没有错)。p> C99中允许使用可变长度数组,但以下(和当前)C11标准使其成为可选功能

因此,只有在使用符合C99的编译器时,才可以使用可变长度(未分配)数组。从未在C++中使用< < /P>
p、 很抱歉我的英语不好。

因为它有不同的用例

当您在调用例程中分配自动内存时,您使用自动内存,您可以随意将该内存传递给被调用方。但是你永远无法把它还给打电话的人

假设有一个库使用不透明结构来存储数据,这是C语言中的一种OOP。API很可能有具有此签名的例程:

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

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

@Serge Ballesta-嗯,这很复杂;这个问题没有加上“C”的标签;我编辑了它,只添加了“C”标记,而没有添加“C++”标记,因为只有另一个标记的位置,伊斯兰使用
malloc()
而不是
new
;但是,伊姆霍,这个问题应该得到一个涵盖两种语言的答案。@Serge Ballesta-没关系;-)。读了你的答案,我明白,很可能伊斯兰教对动态分配内存的有用性有怀疑。所以我认为你的答案比我的好。但我也认为向他解释变长数组不是正确的标准C/C++(C99和可选的C11除外)是合适的。请求:你能简单地编辑一下你的答案吗,添加这个方面?我想你应该把答案留在这里。这是对我的一个很好的补充(即使以前写过),提醒我们VLA不是一个可靠的概念,即使在C@Serge中,我们也可以将数组的地址返回给调用者。实际上,我们不传递数组,而是复制第一个元素的地址。看看我在帖子中编辑的代码,还是没什么不同