21

我一直想知道我怎么能摆脱这个:

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 中是不可能的。我错了吗?

4

4 回答 4

18

这是一个 C99 功能,可以由编译器在以前的版本上实现。

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

于 2011-07-11T21:25:21.373 回答
7

可变长度数组起源于GCC 扩展,但也被C99采用。

它们仍在堆栈上分配,因此使它们“巨大”被认为是不好的风格(并且有一天可能会破坏你)。

于 2011-07-11T21:26:07.787 回答
4

甚至在“可变长度数组”出现之前,由 gcc 和 C99 提供,就有:

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

于 2011-07-11T21:52:29.527 回答
2

“变长数组”在 C99 中被添加到 C 语言中。这在第 6.7.5.2 节“数组声明符”中有所介绍:

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

于 2011-07-11T21:25:55.577 回答