为什么我们需要动态内存分配,尽管我们可以使用可变长度数组来代替?
我们可以在运行时使用可变长度数组分配动态内存:
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);
}
最佳答案
因为它有不同的用例。
当您在调用例程中分配内存时,您使用的是自动内存,您可以随意将该内存传递给被调用方。但是您永远无法将其返回给调用者。
想象一个使用不透明结构来存储数据的库 - 一种 C 中的 OOP。API 可能具有带有此签名的例程:
void * buildEltOfTypeXX(param1, param2, ...);
创建和初始化不透明结构。在那种情况下,显然内存必须使用动态分配 (malloc) 而不是自动分配,因为您会返回一个悬空指针。使用这种模式,调用者将获得内存的所有权,并且在不再需要它时必须释放它。
关于c - 为什么我们需要动态内存分配,尽管我们可以使用可变长度数组来代替?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37323280/