【问题标题】:Is it necessary to use new for dynamic memory allocation?是否有必要使用 new 进行动态内存分配?
【发布时间】:2015-06-09 06:33:07
【问题描述】:

在 C 语言中,我们可以通过动态内存分配的概念从用户那里输入数组的大小(在运行时)。但是我们也可以使用

int n;
scanf("%d",&n);
int a[n];

那么使用new动态内存分配的指针有什么需要呢?

【问题讨论】:

  • C 没有new
  • 这一切都取决于。 “数组”是否应该从函数返回?传递给其他函数?与数组的创建/分配相关的声明在哪里?以后需要调整大小吗?

标签: c arrays variable-length-array


【解决方案1】:

您所展示的称为 C99 支持的可变长度数组。

是的,基于您分配内存的输入。如果你想扩展分配的内存怎么办。

你现在不需要指针吗?为了做realloc()。这是我能想到的一种情况,但我们需要动态内存分配的指针。

C 没有new,所以我的答案是针对具有malloc() 和家族函数的C 的

如果你有一个动态分配内存的函数说

int *alloc_memory()
{
   int n;
   scanf("%d",&n);
   int a[n];
   // Fill values to array and do
   return a;
}

现在这将导致未定义的行为,因为分配的内存仅具有函数的范围。指针对此很有用

int *alloc_memory()
{
   int n;
   scanf("%d",&n);
   int *p = malloc(sizeof(int) * n);
   // Fill values
   return p;
}

关键是 VLA 没有提供指针动态内存分配所提供的灵活性。

【讨论】:

    【解决方案2】:

    Variable length arrayC99 标准之后出现。在此之前,还没有 VLA 的概念。请注意,从C11 开始,这已更改为可选 功能。

    OTOH,使用 malloc()## 进行动态内存分配,很久以前就有家人。

    也就是说,VLA 仍然是一个 array,通常,一个 array 和一个 pointer 是不一样的。数组保存类型和大小信息,而指针没有任何大小信息。

    另外,FWIW,数组 size 可以在 runtime 定义,但这不会改变 scopelifetime 与 普通 数组相比。仅使用 VLA 方法不会将原本 automatic 数组的生命周期更改为 global 或其他。


    ## C 中没有 new 关键字。 GLIBC 提供malloc() 和一系列 API 来处理动态内存分配。

    【讨论】:

      【解决方案3】:

      使用 VLA 在概念上类似于调用 alloca 来分配自动内存。

      可变长度数组 (VLA) 和使用 malloc 动态分配的内存之间的一些区别:

      1) VLA 是一个自动变量,在您的函数返回时将不复存在。而使用malloc 动态分配的内存将一直存在,直到调用free 或您的程序退出。

      2) 对于数组以外的数据类型,例如结构,您可能希望使用malloc 分配。

      3) VLA 通常存储在堆栈上(尽管这不是 C99 规范严格要求的),而使用malloc 动态分配的内存存储在堆上。

      【讨论】:

        【解决方案4】:

        您没有进行任何“动态内存分配”,即使用动态生命周期分配内存。您在 C99 中使用“可变长度数组”。但它仍然是一个局部变量,具有“自动存储持续时间”,也就是说变量的生命周期是它被声明的作用域。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-08
          • 1970-01-01
          • 1970-01-01
          • 2020-11-12
          • 1970-01-01
          • 1970-01-01
          • 2016-04-10
          • 1970-01-01
          相关资源
          最近更新 更多