c - 局部变长数组

标签 c arrays memory c99

在 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 Variable Length Array .一个类似的提议几乎进入了 C++14,但没有。所以这段代码不是有效的标准 C++,但你的编译器可能支持它。 AFAIK,C99 VLA 将它们的内存存储在堆栈中。

关于c - 局部变长数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30694199/

相关文章:

c - 数组占用的内存空间

java - Java 是如何设法在 Applet 模式下使用这么多内存的?

java - 使用字符串与字节[]作为值,映射中的内存使用情况

c - 关于地址值和指针增量的问题?

c - 使用 fgets() 和 strtok() 在 C 中逐行读取文件?

c++ - 如何修复这个: Argument of type “const char*” is incompatible with the parameter of type "char** [duplicate]

ios - 加入混合的从右到左和从左到右的语言字符串时的奇怪行为

c - 使用系统调用在 C 中实现 grep

c - first defined here 只有一个文件的多个定义

php - 数组在 "IN"语句中被屏蔽为字符串