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

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

最佳答案

因为它有不同的用例。

当您在调用例程中分配内存时,您使用的是自动内存,您可以随意将该内存传递给被调用方。但是您永远无法将其返回给调用者。

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

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

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

关于c - 为什么我们需要动态内存分配,尽管我们可以使用可变长度数组来代替?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37323280/

相关文章:

c++ - 套接字应用程序无法正常工作

c - 数组与 memcpy 比较 vs 逐元素比较

python - 我可以在 Django 的 View 中声明变量时将变量传递到表单中吗

asp.net - 我可以使用构造函数动态创建用户控件吗?

c - 仅使用指针在动态结构中使用二维数组的 fscanf

c - 多个数据类型的单个 malloc

c - printf 只显示 char* 的 24 个字符

在结构中创建矩阵

javascript - 动态服务器时间

c - 在 char 设备中,我应该把 ioread 放在哪里?