我是靠谱客的博主 无聊皮带,这篇文章主要介绍【归纳Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的分配地址】一、内存分配二、Ubuntu 和 STM32 下的输出验证,现在分享给大家,希望可以做个参考。

归纳Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的分配地址

  • 一、内存分配
    • 1、全局变量与局部变量
    • 2、堆与栈
  • 二、Ubuntu 和 STM32 下的输出验证
    • 1、Ubuntu
    • 2、keil

一、内存分配

请添加图片描述
请添加图片描述

1、全局变量与局部变量

全局变量:
在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件。
局部变量:
定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效,再调用就是出错。
区别:
请添加图片描述

2、堆与栈

栈:是为执行线程留出的内存空间。当函数被调用的时候,栈顶为局部变量和一些bookkeeping 数据预留块。当函数执行完毕,块就没有用了,可能在下次的函数调用的时候再被使用。栈通常用后进先出(LIFO)的方式预留空间;因此最近的保留块(reserved block)通常最先被释放。这么做可以使跟踪堆栈变的简单;从栈中释放块(free block)只不过是指针的偏移而已。
堆(heap):是为动态分配预留的内存空间。和栈不一样,从堆上分配和重新分配块没有固定模式;你可以在任何时候分配和释放它。这样使得跟踪哪部分堆已经被分配和被释放变的异常复杂;有许多定制的堆分配策略用来为不同的使用模式下调整堆的性能。
对比如下:
请添加图片描述

二、Ubuntu 和 STM32 下的输出验证

1、Ubuntu

首先创建一个c文件

复制代码
1
2
gedit test.c

添加下面代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h> #include <stdlib.h> //定义全局变量 int init_global_a = 1; int uninit_global_a; static int inits_global_b = 2; static int uninits_global_b; void output(int a) { printf("hello"); printf("%d",a); printf("n"); } int main( ) { //定义局部变量 int a=2; static int inits_local_c=2, uninits_local_c; int init_local_d = 1; output(a); char *p; char str[10] = "lmy"; //定义常量字符串 char *var1 = "1234567890"; char *var2 = "qwertyuiop"; //动态分配 int *p1=malloc(4); int *p2=malloc(4); //释放 free(p1); free(p2); printf("栈区-变量地址n"); printf(" a:%pn", &a); printf(" init_local_d:%pn", &init_local_d); printf(" p:%pn", &p); printf(" str:%pn", str); printf("n堆区-动态申请地址n"); printf(" %pn", p1); printf(" %pn", p2); printf("n全局区-全局变量和静态变量n"); printf("n.bss段n"); printf("全局外部无初值 uninit_global_a:%pn", &uninit_global_a); printf("静态外部无初值 uninits_global_b:%pn", &uninits_global_b); printf("静态内部无初值 uninits_local_c:%pn", &uninits_local_c); printf("n.data段n"); printf("全局外部有初值 init_global_a:%pn", &init_global_a); printf("静态外部有初值 inits_global_b:%pn", &inits_global_b); printf("静态内部有初值 inits_local_c:%pn", &inits_local_c); printf("n文字常量区n"); printf("文字常量地址 :%pn",var1); printf("文字常量地址 :%pn",var2); printf("n代码区n"); printf("程序区地址 :%pn",&main); printf("函数地址 :%pn",&output); return 0; }

请添加图片描述
保存退出,编译运行代码

复制代码
1
2
gcc test.c -o test
复制代码
1
2
./test

请添加图片描述

可以发现,Ubuntu在栈区和堆区的地址值都是从上到下增长的。

2、keil

直接用以前的串口通信工程进行改写
main.c如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "usart.h" #include <stdio.h> #include <stdlib.h> int init_global_a = 1; int uninit_global_a; static int inits_global_b = 2; static int uninits_global_b; void output(int a) { printf("hello"); printf("%d",a); printf("n"); } int main(void) { uart_init(115200); while(1) { //定义局部变量 int a=2; static int inits_local_c=2, uninits_local_c; int init_local_d = 1; char *p; char str[10] = "zls"; //定义常量字符串 char *var1 = "1234567890"; char *var2 = "qwertyuiop"; //动态分配 int *p1=malloc(4); int *p2=malloc(4); output(a); //释放 free(p1); free(p2); printf("栈区-变量地址n"); printf(" a:%pn", &a); printf(" init_local_d:%pn", &init_local_d); printf(" p:%pn", &p); printf(" str:%pn", str); printf("n堆区-动态申请地址n"); printf(" %pn", p1); printf(" %pn", p2); printf("n全局区-全局变量和静态变量n"); printf("n.bss段n"); printf("全局外部无初值 uninit_global_a:%pn", &uninit_global_a); printf("静态外部无初值 uninits_global_b:%pn", &uninits_global_b); printf("静态内部无初值 uninits_local_c:%pn", &uninits_local_c); printf("n.data段n"); printf("全局外部有初值 init_global_a:%pn", &init_global_a); printf("静态外部有初值 inits_global_b:%pn", &inits_global_b); printf("静态内部有初值 inits_local_c:%pn", &inits_local_c); printf("n文字常量区n"); printf("文字常量地址 :%pn",var1); printf("文字常量地址 :%pn",var2); printf("n代码区n"); printf("程序区地址 :%pn",&main); printf("函数地址 :%pn",&output); return 0; } }

编译成功

请添加图片描述
烧写后在上位机的效果如下:
请添加图片描述
STM32 在栈区和堆区的地址值从上往下是变小的,与Ubuntu下刚好相反。

最后

以上就是无聊皮带最近收集整理的关于【归纳Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的分配地址】一、内存分配二、Ubuntu 和 STM32 下的输出验证的全部内容,更多相关【归纳Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的分配地址】一、内存分配二、Ubuntu内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部