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

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

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的C中不可能使用动态数组。 我错了吗?

这是C99function,可以由编译器在先前版本上实现。

ISO C99允许使用可变长度自动数组,作为扩展,GCC在C90模式和C ++中接受它们。 这些数组的声明与任何其他自动数组一样,但其长度不是常量表达式。 存储在声明点分配,并在退出支撑级别时释放。

可变长度arrays起源于GCC扩展 ,但它们也被C99采用。

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

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

如果size是一个不是整数常量表达式的表达式:如果它出现在函数原型范围的声明中,则将其视为*被替换为*; 否则,每次评估它时,其值应大于零。 变长数组类型的每个实例的大小在其生命周期内不会改变。 如果size表达式是sizeof运算符的操作数的一部分,并且更改size表达式的值不会影响运算符的结果,则无法指定是否计算size表达式。

甚至在“可变长度arrays”存在之前,gcc和C99礼貌,有:

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