7

关于动态内存的讨论:“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";

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

4

5 回答 5

11

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

于 2009-01-15T23:04:00.477 回答
8

我同意 ocdecio 的观点,即不允许

int array[variable]

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

于 2009-01-15T23:04:39.807 回答
3

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

于 2011-07-25T22:42:33.533 回答
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;
}

我保证:-)

于 2017-01-20T18:20:53.750 回答
0

因为

int array[variable];

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

char name[] = "Nick";

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

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

只是不要忘记 free() 它。

于 2009-01-15T23:04:07.327 回答