是否有必要使用new进行动态内存分配?

时间:2015-06-09 06:33:07

标签: c arrays variable-length-array

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

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

那么使用new使用指针进行动态内存分配的需求是什么?

4 个答案:

答案 0 :(得分:3)

NSWindowController标准之后

Variable length array成立。在此之前,VLA没有概念。请注意,从C99开始,这已经更改为可选功能。

OTOH,使用C11 ## 和家人的动态内存分配从很久以前开始。

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

此外,FWIW,阵列 size 可以在运行时定义,但这不会改变范围生命周期< / em>与普通数组相比。仅使用VLA方法不会将自动数组的生命周期更改为全局或其他内容。

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

答案 1 :(得分:3)

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

根据您分配内存的输入而定。如果你想扩展分配的内存怎么办。

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

C没有new所以我的答案特定于C malloc()和家庭功能

如果你有一个动态分配内存的功能说

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 :(得分:0)

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

可变长度数组(VLA)与使用malloc动态分配的内存之间存在一些差异:

1)VLA是一个自动变量,当你的函数返回时它将不复存在。在malloc被调用或程序退出之前,将存在动态分配的free内存。

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

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

答案 3 :(得分:0)

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