在C中,我们可以通过动态内存分配的概念从用户输入数组的大小(在运行时)。但我们也可以使用
int n;
scanf("%d",&n);
int a[n];
那么使用new
使用指针进行动态内存分配的需求是什么?
答案 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中使用“可变长度数组”。但它仍然是一个局部变量,具有“自动存储持续时间”,这意味着变量的生命周期是声明它的范围。