变量大小的数组与C中的calloc

关于动态内存的讨论: “C指针和动态内存简介”

作者说:

像这样的存储块可以有效地用作更灵活的arrays。 在现实世界的C程序中,这种方法实际上更为常见。 它比“可变大小arrays”更具可预测性和灵活性

他正在讨论的内存块类型是这样的:

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"; 

作者并没有真正阐明为什么我更喜欢前一种方法而不是后一种方法。 或者更具体地说:它如何更“可预测和灵活”?

如果声明int array[variable] ,则将在堆栈上分配内存,这对于大型,相对永久的数据结构(例如您可能想要返回的数据结构)不是很好。 如果使用数组语法,则不需要手动释放内存,因为它在超出范围时会被释放。 另一方面, calloc将在堆上的运行时动态分配内存。 一旦你完成它就必须自己释放它。

我同意c89不允许的ocdecio

 int array[variable] 

c99允许某些类型的变量和表达式为数组大小。 但除此之外,使用realloc可以调整使用malloc和family分配的内容。

在堆栈上使用可变大小的数组作为自动变量(而不是使用calloc / malloc / new / etc的堆)对于将要运行很长时间且需要制作和销毁批次的进程来说并不是一个坏主意小arrays 这是因为保证堆栈不会变得碎片化,而内存可以并且将会碎片化。 如果您编写的固件或服务需要运行多年而不停止,则几乎禁止使用malloc或new。

ISO C99允许使用可变长度自动数组,作为扩展,GCC在C90模式和C ++中接受它们。 所以,不要忘记设置编译器标志-std = c99或-std = gnu99。 以下示例将起作用

 #include 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; } 

我保证:-)

因为

 int array[variable]; 

在标准C中无效 – 您只能使用常量定义数组的长度。 (比如你的

 char name[] = "Nick"; 

例如,它不是可变长度的)。

因此,如果要根据程序变量创建长度数组,则必须使用calloc()等内存分配器。

只是不要忘记免费()它。