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

lt0*_*511 20 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;
}
Run Code Online (Sandbox Code Playgroud)

copy无论如何,char数组都被分配,程序运行正常,打印出原始数据和副本.而Valgrind并没有抱怨什么.

我认为没有malloc的C语言中不可能使用动态数组.我错了吗?

Joe*_*Joe 18

这是C99功能,可以由编译器先前版本上实现.

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


Nem*_*emo 7

可变长度阵列起源于GCC扩展,但它们也被C99采用.

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