在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值时),除了检查长度的大小是什么可以采取其他措施来获取安全代码吗?或者它可能已经安全了?
答案 0 :(得分:2)
您在此代码中看到的是C99 Variable Length Array。一个类似的提议差不多是C ++ 14,但没有。所以这段代码不是有效的STANDARD C ++,但你的编译器可能会支持它。 AFAIK,C99 VLA将其内存存储在堆栈中。
答案 1 :(得分:1)
请参阅此question和this one。这是一个GCC extension:
ISO C99允许使用可变长度自动数组,作为扩展,GCC在C90模式和C ++中接受它们。这些数组的声明与任何其他自动数组一样,但其长度不是常量表达式。存储在声明点分配,并在包含声明的块作用域退出时释放。