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
- The GNU C Compiler allocates memory for VLAs with automatic storage duration on the stack. This is the faster and more straightforward option compared to heap-allocation, and is used by most compilers.
- VLAs can also be allocated on the heap and internally accessed using a pointer to this block.
我的函数代码某处有问题,我想声明一个数组,但它失败了。经过一些调试后,我发现它在反汇编 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
- The GNU C Compiler allocates memory for VLAs with automatic storage duration on the stack. This is the faster and more straightforward option compared to heap-allocation, and is used by most compilers.
- VLAs can also be allocated on the heap and internally accessed using a pointer to this block.