关于动态记忆的讨论:"Intro to C Pointers and Dynamic Memory"
作者声明:
这样的内存块可以有效地用作更灵活的阵列。实际上,这种方法在现实世界的C程序中更为常见。它比“可变大小的阵列”更具可预测性和灵活性
他所谈论的内存块的类型是这样的:
const int size = 5;
int * array = calloc(size, sizeof(int));
然后使用另一个指针迭代数组:
int * index = array;
for (i = 0; i < size; i++) {
*index = 1; // or whatever value
index++;
}
我的问题是这种方法比这样的标准变量大小的数组更好吗?:
int array[variable];
或动态:
char name[] = "Nick";
作者并没有真正阐明为什么我应该更喜欢前一种方法。或者更具体地说:它如何更“可预测和灵活”?
答案 0 :(得分:10)
如果声明int array[variable]
,将在堆栈上分配内存,这对于大型,相对永久的数据结构(例如您可能想要返回的数据结构)不是很好。如果使用数组语法,则不需要手动释放内存,因为它在超出范围时会被释放。另一方面,calloc
将在堆上的运行时动态分配内存。一旦你完成它就必须自己释放它。
答案 1 :(得分:8)
答案 2 :(得分:3)
使用堆栈上的可变大小的数组作为自动变量(而不是使用calloc / malloc / new / etc的堆)对于将要运行很长时间且需要进行的进程来说并不是一个坏主意并摧毁许多小阵列。这是因为保证堆栈不会碎片化,而内存可以并且将会碎片化。如果您编写的固件或服务需要运行多年而不停止,则几乎禁止使用malloc或new。
答案 3 :(得分:2)
ISO C99允许使用可变长度自动数组,作为扩展,GCC在C90模式和C ++中接受它们。 所以,不要设置编译器标志-std = c99或-std = gnu99。以下示例将起作用
#include<stdio.h>
int main()
{
int n;
printf("\n\tEnter the number of digits: ");
scanf("%d", &n);
char str[n];
for(int i=0; i < n; i++) {
scanf("%s", &str[i]);
}
printf("\n\tThe entered digits are: %s", str);
return 0;
}
我保证: - )
答案 4 :(得分:0)
由于
int array[variable];
在标准C中无效 - 您只能使用常量定义数组的长度。 (比如你的
char name[] = "Nick";
示例,它不是可变长度的。)
因此,如果要根据程序变量创建长度数组,则必须使用calloc()等内存分配器。
请不要忘记释放()它。