局部变长数组

在C ++中的一些代码重构期间,我遇到了以下局部变量长度数组

void some_function(uint8_t length, uint8_t id, uint8_t * bytes)) { uint8_t string[length + 8]; //some transformation on string [1-8] elements do_something(string); } 

我不熟悉C99,但是使用可变长度数组大小[x + y]看起来像将放在堆中。 此外,我调试此函数,以确保此“字符串”变量放在堆上,它是。 在C中,局部变量不能是固定大小,因此在使用它们之后不需要清理它们。 但是这里我们有固定大小的数组而没有内存分配,所以不需要在这个变量之后清理,但是GCC编译器如何管理这个内存?

或者也许以其他方式澄清我在这里考虑的内容:长度变量来自外部IO所以在我看来可能存在安全问题(例如当长度为INTEGER_MAX值时),除了检查长度大小还有其他什么行动可以这里有安全代码吗? 或者它可能已经安全了?

您在此代码中看到的是C99 可变长度数组 。 一个类似的提议几乎使它成为C ++ 14,但没有。 所以这段代码不是有效的STANDARD C ++,但你的编译器可能会支持它。 AFAIK,C99 VLA将其内存存储在堆栈中。

看到这个问题和这个 问题 。 这是GCC扩展 :

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