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

C Keil compiler uses malloc for local variables,why?

我的函数代码某处有问题,我想声明一个数组,但它失败了。经过一些调试后,我发现它在反汇编 window 中使用了 malloc,所以我增加了堆大小并且它工作正常!

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

这里是变量声明代码:

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

我添加了标志 C99

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

根据Keil的documentation(见注释),这种数组是由这个编译器分配在堆上的。 (其他人可能会在堆栈上分配。其他人可能根本不会实现此功能 - 它在 C11 中成为可选的。)

您的局部变量 result 声明如下:

uint8_t result[data->capacityBytes];

假设 data->capacityBytes 不是常量,这意味着 result 将是 Variable Length Array (VLA),这将解释您正在使用的编译器的行为。

然后你假设内存区域中的变量位置是标准化的,不幸的是这是不正确的,如answer:

中所述

The C language does not define where any variables are stored, actually. It does, however, define three storage classes: static, automatic, and dynamic.

变量的存储位置取决于编译器对源代码的解释。

另见 wikipedia entry about variable length array

Memory

Allocation