我一直想知道如何逃脱这个:
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, strlen(copy));
return 0;
}
无论如何都会分配char数组copy
,程序运行正常,打印出原始数据和副本。而Valgrind并没有抱怨任何事情。
我认为在没有malloc的情况下,动态数组是不可能的。我错了吗?
答案 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表达式的值不会 影响操作员的结果,是否未指定 评估大小表达式。