2009-01-15 37 views
7

在这里动态存储器的讨论:"Intro to C Pointers and Dynamic Memory"可变尺寸的阵列VS释放calloc用C

作者指出:

像这样的存储器块可有效地用作一个更灵活的阵列。这种方法实际上在现实世界的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"; 

笔者并没有真正摆脱多的光,为什么我应该更喜欢前一种方法后者。或者更具体地说:它如何更“可预测和灵活”?

+2

[malloced阵列VS.的可能的复制可变长度数组](http://stackoverflow.com/questions/16672322/malloced-array-vs-variable-length-array) – 2016-04-23 07:37:46

回答

10

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

+0

http://gcc.gnu.org/onlinedocs/gcc/Variable-Length。 html – 2009-01-15 23:09:49

0

由于

int array[variable]; 

不在标准C有效 - 你只能以恒定定义数组的长度。 (例如您的

char name[] = "Nick"; 

示例,它不是可变长度)。

因此,如果您想基于程序变量创建一个长度数组,则需要使用像calloc()这样的内存分配器。

只是不要忘记释放()它。

+0

确实,它不是可变长度。我想我应该把“动态”。由于编译器确定应该分配多少。 – nmiller 2009-01-15 23:10:54

8

我ocdecio是同意不允许

int array[variable] 

允许某些类型的变量和表达式是数组的大小。但除此之外,使用realloc可以调整分配给malloc和家人的东西。

3

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

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

我garantee是:-)