C Keil编译器将malloc用于局部变量,为什么?

阿里雷扎

我想在函数中的代码中某个地方声明一个数组,但是它失败了。经过一些调试后,我发现它在反汇编窗口中使用了malloc,因此我增加了堆大小,并且可以正常工作!

所以我的问题是为什么keil使用Heap作为局部变量?

这是变量声明代码:

uint8_t result[data->capacityBytes];
memset(result, 0, sizeof(result));

我添加了标志C99

您的数组具有动态大小,即,编译器直到运行时才知道它的大小。这是C99中引入的称为可变长度数组(VLA)的功能。

根据Keil的文档(请参阅注释),此类数组由该编译器分配在堆上。(其他人可能在堆栈上分配。其他人可能根本没有实现此功能-在C11中成为可选功能。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么C ++编译器不优化对结构数据成员的读写操作,而不是对不同的局部变量进行优化?

现代C ++编译器会自动将局部变量初始化为0吗?

如何坚持C编译器将局部变量放在堆栈上,而不是在寄存器中

Visual Studio C ++编译器在局部变量对象上的异常行为

C#编译器-未分配的字段和局部变量初始值

C++ 编译器是否会自动为超出范围的局部变量使用 std::move 构造函数?

是否可以为未分配的局部变量保证CS0165 C#编译器错误?

哪种C / C ++编译器可以使用推式弹出指令创建局部变量,而不仅仅是增加esp一次?

为什么编译器允许引用用于C ++中的运行时多态?

为什么需要C ++编译器来编译Rust?

为什么编译器不总是优化掉局部变量?

为什么C ++编译器不立即删除生命周期之外的变量?

为什么C ++编译器没有优化未使用的参考变量?

C#浮点文字:为什么编译器不默认为左侧变量类型

C ++为什么编译器无法生成返回Lambda中捕获变量的const引用的代码

为什么C和C ++编译器将显式初始化和默认初始化的全局变量放在不同的段中?

为什么C ++编译器允许将extern关键字与定义结合使用?

为什么Visual Studio C ++编译器拒绝将枚举作为模板参数?

为什么将C#ValueTuple和动态混合时此编译器错误

为什么C#编译器将il代码留给条件方法?

为什么编译器将C程序汇编成这个?

为什么此代码段适用于C ++ 17,而编译器在使用C ++ 11时却抱怨呢?

即使C ++编译器无法编译,为什么C编译器仍可以编译此代码?

CMake为什么要检查C ++编译器?

为什么C ++编译器的常数折叠效果更好?

为什么C#编译器允许空枚举?

为什么C ++ 11允许您将局部变量声明为thread_local?

为什么要在C中重新加载静态局部变量?

为什么C允许使用未初始化的局部变量?