打印
[经验分享]

关于keil中内存分配的问题,局部变量、全局变量,堆栈的分配

[复制链接]
楼主: dzfansman
手机看帖
扫描二维码
随时随地手机跟帖
21
saservice| | 2024-1-8 16:38 | 只看该作者 回帖奖励 |倒序浏览
当函数调用时,如果局部变量尚未分配,编译器会即时为其分配内存。局部变量的作用域仅限于定义它的函数内,当函数执行完毕退出后,局部变量所占用的内存会被释放。

使用特权

评论回复
22
macpherson| | 2024-1-8 17:17 | 只看该作者
堆栈是一个后进先出(LIFO)的数据结构,用于存储局部变量和函数调用的信息。
当一个函数被调用时,它的参数、返回地址和局部变量被推入堆栈。
当函数返回时,这些数据从堆栈中弹出。
堆栈的大小是有限的,因此过度使用可能导致堆栈溢出。

使用特权

评论回复
23
wilhelmina2| | 2024-1-8 18:12 | 只看该作者
在内存中的位置:全局变量存储在静态数据区(Static Data Area),通常位于RAM中,对于嵌入式系统如STM32等,还可能有一部分全局变量会存放在Flash中(如果它们被声明为const或使用了特定的存储类属性)。

使用特权

评论回复
24
updownq| | 2024-1-9 16:35 | 只看该作者
局部变量是在函数或代码块内部定义的变量。
这些变量仅在其定义的函数或代码块中可见。
当函数执行时,局部变量存储在堆栈中。
它们的生命周期仅限于它们所在的函数或代码块。
局部变量的生命周期开始于函数或代码块的开始,并在其执行结束时结束。

使用特权

评论回复
25
rosemoore| | 2024-1-9 19:55 | 只看该作者
未初始化的全局变量和已初始化的全局变量通常存储在不同的区域,但它们都位于全局区。

使用特权

评论回复
26
lzbf| | 2024-1-9 20:27 | 只看该作者
动态分配的内存由程序员显式地创建和释放,使用不当可能导致内存泄漏。在Keil环境中,即使是嵌入式系统也支持堆内存管理,但需要注意的是,由于资源有限,需要谨慎管理堆内存的分配与释放。

使用特权

评论回复
27
febgxu| | 2024-1-9 21:28 | 只看该作者
全局变量是在程序的全局作用域中声明的变量,其作用域覆盖整个程序。全局变量存储在数据段(Data Segment)或者初始化数据段(Initialized Data Segment)中。数据段包含已初始化的全局变量,而初始化数据段包含未初始化的全局变量。在程序运行过程中,全局变量始终占用内存空间。

使用特权

评论回复
28
bartonalfred| | 2024-1-10 07:20 | 只看该作者
在Keil中,栈的大小可以在项目设置中进行配置。如果栈的大小设置不当,可能会导致栈溢出,从而覆盖全局变量或其他数据。

使用特权

评论回复
29
chenci2013| | 2024-1-10 08:14 | 只看该作者
在Keil中,内存分配主要有全局变量、局部变量和堆栈的分配。

使用特权

评论回复
30
youtome| | 2024-1-10 11:49 | 只看该作者
在配置栈和堆的大小时,需要考虑到程序中局部变量和动态内存分配的需求。

使用特权

评论回复
31
maqianqu| | 2024-1-10 12:02 | 只看该作者
全局变量在整个程序执行期间都存在,并且它们的生命周期从程序开始运行到结束。

使用特权

评论回复
32
primojones| | 2024-1-10 12:35 | 只看该作者
堆栈则是一种特定的内存管理方式。在执行程序时,每当进入一个函数时,就会在栈上为这个函数创建一个新的栈帧,用来存放该函数的局部变量和参数等数据。当函数执行完毕后,对应的栈帧就会被自动清除,这种自动化的内存管理方式能有效防止内存泄漏问题。

使用特权

评论回复
33
saservice| | 2024-1-10 12:51 | 只看该作者
局部变量的生命周期从它们被声明的时刻开始,直到包含它们的函数执行完毕。

使用特权

评论回复
34
updownq| | 2024-1-10 13:43 | 只看该作者
在C语言中动态分配的内存区域称为堆。通过malloc()、calloc()、realloc()等函数申请的内存是在堆上分配的。

使用特权

评论回复
35
bestwell| | 2024-1-10 15:06 | 只看该作者
全局变量是在函数外部定义的变量,可以在整个程序中访问。
这些变量在程序的整个生命周期内都存在。
全局变量通常存储在程序存储器或数据存储器中。
在C语言中,全局变量在所有函数之外定义,且在程序的整个生命周期内都存在。

使用特权

评论回复
36
lzmm| | 2024-1-10 15:42 | 只看该作者
对于实时性要求高的系统,合理地配置堆栈大小和使用时机对于确保系统响应速度和稳定性至关重要。

使用特权

评论回复
37
modesty3jonah| | 2024-1-10 15:51 | 只看该作者
在必要时,使用内存分析工具来检查内存使用情况和潜在的内存泄漏。

使用特权

评论回复
38
mmbs| | 2024-1-10 15:59 | 只看该作者
局部变量定义在函数内部,其生命周期仅限于该函数被执行时,当函数返回后,局部变量所占用的内存空间将被释放。

使用特权

评论回复
39
febgxu| | 2024-1-10 16:13 | 只看该作者
对于嵌入式系统开发,由于内存资源有限,合理有效地使用这些内存区域至关重要。

使用特权

评论回复
40
adolphcocker| | 2024-1-10 16:31 | 只看该作者
全局变量存储在程序的静态(static)区域,也称为全局区或静态区。
全局变量在程序的整个运行期间都是有效的,它们的生命周期从程序开始到程序结束。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则