当我们在 c 中有更简单的代码时,为什么我们使用 malloc 或 calloc?
Why do we use malloc or calloc when we have a simpler code in c?
#include <stdio.h>
int main() {
int n = 0, i;
printf("Enter the size of array\n");
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++) {
a[i] = i + 1;
printf("%d,", a[i]);
}
}
我可以知道 malloc()
和 calloc()
与此代码之间的区别吗,因为我想两者都满足了需求?
请注意,根据最新标准,VLA 不是规范的强制性部分。分配器函数(malloc()
和系列)是分配内存的标准方法,其大小仅在 run-time.
处已知
引用 C18
,第 6.7.6.2/P4 章
[...] (Variable length arrays are a conditional feature that implementations need not support; see
6.10.8.3.)
也就是说,由于 VLA 的性质,它们还有其他使用限制,它们的生命周期仅限于定义的范围内。例如,您不能 return 在函数调用的函数中定义的 VLA,但是如果您使用分配器函数,则可以 return 指针,因为它的生命周期一直保持到以编程方式释放(调用 free()
).
行
int a[n];
将 a
声明为 variable-length 数组 。 VLA 很有用,但有局限性:
- 它们不能用
static
关键字或在文件范围内声明;
- 它们不能在声明中初始化——例如,你不能写类似
int a[n] = {0};
; 的东西
- 他们不能是
struct
或 union
类型的成员;
- 它们不能任意大;
- 它们并未得到普遍支持 - 它们是在 1999 年的语言定义修订版中引入的,并在 2011 年的修订版中成为可选的;
- 它们在定义后无法调整大小 - variable-length 中的“变量”仅表示它们的大小不是从一个定义到下一个定义是固定的。
与任何 auto
变量一样,当您退出其封闭范围时,它们将不复存在。
Dynamically-allocated 内存相对于 VLA 有一些优势:
- 在您明确
free
之前,内存会一直分配;
- 您可以分配任意大的内存块;
- 您可以根据需要调整分配块的大小;
- 与 VLA 不同,
malloc
、calloc
和 realloc
受任何托管实施的支持;
如果你只需要一个函数内的一些临时工作存储,你不知道它的大小提前,你不需要太多,并且它们受支持,那么 VLA 是一个不错的选择并且比使用 malloc
或 calloc
.
更简洁
#include <stdio.h>
int main() {
int n = 0, i;
printf("Enter the size of array\n");
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++) {
a[i] = i + 1;
printf("%d,", a[i]);
}
}
我可以知道 malloc()
和 calloc()
与此代码之间的区别吗,因为我想两者都满足了需求?
请注意,根据最新标准,VLA 不是规范的强制性部分。分配器函数(malloc()
和系列)是分配内存的标准方法,其大小仅在 run-time.
引用 C18
,第 6.7.6.2/P4 章
[...] (Variable length arrays are a conditional feature that implementations need not support; see 6.10.8.3.)
也就是说,由于 VLA 的性质,它们还有其他使用限制,它们的生命周期仅限于定义的范围内。例如,您不能 return 在函数调用的函数中定义的 VLA,但是如果您使用分配器函数,则可以 return 指针,因为它的生命周期一直保持到以编程方式释放(调用 free()
).
行
int a[n];
将 a
声明为 variable-length 数组 。 VLA 很有用,但有局限性:
- 它们不能用
static
关键字或在文件范围内声明; - 它们不能在声明中初始化——例如,你不能写类似
int a[n] = {0};
; 的东西
- 他们不能是
struct
或union
类型的成员; - 它们不能任意大;
- 它们并未得到普遍支持 - 它们是在 1999 年的语言定义修订版中引入的,并在 2011 年的修订版中成为可选的;
- 它们在定义后无法调整大小 - variable-length 中的“变量”仅表示它们的大小不是从一个定义到下一个定义是固定的。
与任何 auto
变量一样,当您退出其封闭范围时,它们将不复存在。
Dynamically-allocated 内存相对于 VLA 有一些优势:
- 在您明确
free
之前,内存会一直分配; - 您可以分配任意大的内存块;
- 您可以根据需要调整分配块的大小;
- 与 VLA 不同,
malloc
、calloc
和realloc
受任何托管实施的支持;
如果你只需要一个函数内的一些临时工作存储,你不知道它的大小提前,你不需要太多,并且它们受支持,那么 VLA 是一个不错的选择并且比使用 malloc
或 calloc
.