没有malloc的C中的动态数组?

时间:2011-07-11 21:20:34

标签: c variable-length-array

我一直想知道如何逃脱这个:

int main(int argc, char **argv) {
    printf("%p %s %d\n", &argv[1], argv[1], strlen(argv[1]));
    char copy[strlen(argv[1]) + 1];
    strcpy(copy, argv[1]);
    printf("%p %s %d\n", &copy, copy, strlen(copy));
    return 0;
}

无论如何都会分配char数组copy,程序运行正常,打印出原始数据和副本。而Valgrind并没有抱怨任何事情。

我认为在没有malloc的情况下,动态数组是不可能的。我错了吗?

4 个答案:

答案 0 :(得分:18)

这是C99功能,可以在prior versions by the compiler上实施。

  

ISO C99允许使用可变长度自动数组,并且作为   扩展GCC在C90模式和C ++中接受它们。这些数组是   声明像任何其他自动数组,但长度是   不是一个恒定的表达。存储分配在   声明并在退出括号级别时取消分配。

答案 1 :(得分:7)

可变长度数组起源于GCC extension,但它们也被C99采用。

它们仍被分配到堆栈中,因此将它们设置为“巨大”被认为是糟糕的风格(并且有一天可能会破坏你。)

答案 2 :(得分:3)

即使在存在“可变长度阵列”之前,gcc和C99也提供了:

alloca() - 允许动态分配堆栈(“自动”)内存。

答案 3 :(得分:2)

在C99中将“可变长度数组”添加到C语言中。这将在§6.7.5.2“数组声明符”中介绍:

  

如果大小是不是整数常量的表达式   表达式:如果它出现在函数原型范围的声明中,   它被视为被*替换;否则,每次都是   评估它应具有大于零的值。每个的大小   可变长度数组类型的实例在其期间不会更改   一生。 size表达式是sizeof的操作数的一部分   运算符和更改size表达式的值不会   影响操作员的结果,是否未指定   评估大小表达式。