本地可变长度数组(Local variable length array)

2019-10-23 06:52发布

用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值),除了检查长度的大小还有什么其他的动作可以被带到这里有安全码? 或者,也许它已经安全吗?

Answer 1:

你在这个代码中看到的是C99 变长数组 。 一项类似的提案几乎去到C ++ 14,但没有。 所以这段代码是无效的C ++标准,而是你的编译器可以支持它。 据我所知,C99沃拉斯存储自己的堆栈内存。



Answer 2:

看到这个问题,并且这一个 。 这是一个GCC扩展 :

可变长度自动数组被允许在ISO C99,并作为扩展GCC接受他们在C90模式和C ++。 这些阵列被声明像任何其他自动数组,但是具有的长度是不是一个常量表达式。 存储在声明的点被分配和含有该声明退出块范围时释放。



文章来源: Local variable length array