为什么我们需要动态内存分配,尽管我们可以使用可变长度数组?
我们可以在运行时使用可变长度数组分配动态内存:
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);
}
答案 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:抱歉我的英语不好。