一、C语言程序里全局变量、局部变量、堆、栈等概念
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char g_buf[16];
char g_buf2[16];
char g_buf3[16];
char g_buf4[16];
int main()
{
printf("g_buf: 0x%x\n", g_buf);
printf("g_buf2: 0x%x\n", g_buf2);
printf("g_buf3: 0x%x\n", g_buf3);
printf("g_buf4: 0x%x\n", g_buf4);
return 0;
}
定义并输出4个全局变量的地址
发现地址在全局区域里,且依次递增
2.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char l_buf[16];
char l_buf2[16];
char l_buf3[16];
printf("l_buf: 0x%x\n", l_buf);
printf("l_buf2: 0x%x\n", l_buf2);
printf("l_buf3: 0x%x\n", l_buf3);
}
定义并输出3个局部变量的地址
发现地址也是依次递增
二、stm32的堆、栈、全局变量的分配地址
套用野火官网的串口通信模板,修改main函数
1.
#include "stm32f10x.h"
#include "bsp_usart.h"
char global1[16];
char global2[16];
char global3[16];
int main(void)
{
char part1[16];
char part2[16];
char part3[16];
USART_Config();
printf("part1: 0x%p\n", part1);
printf("part2: 0x%p\n", part2);
printf("part3: 0x%p\n", part3);
printf("global1: 0x%p\n", global1);
printf("global2: 0x%p\n", global2);
printf("global3: 0x%p\n", global3);
while(1)
{
}
}
程序定义了3个局部变量和3个全局变量,并输出地址
文件下载到板子上,按下Reset,显示结果如下
发现局部变量储存到了栈中,地址依次减小。全局变量储存到了静态区,地址依次增加。
#include "stm32f10x.h"
#include "bsp_usart.h"
#include <stdlib.h>
int main(void)
{
static char st1[16];
static char st2[16];
static char st3[16];
char *p1;
char *p2;
char *p3;
USART_Config();
printf("st1: 0x%p\n", st1);
printf("st2: 0x%p\n", st2);
printf("st3: 0x%p\n", st3);
p1 = (char *)malloc(sizeof(char) * 16);
p2 = (char *)malloc(sizeof(char) * 16);
p3 = (char *)malloc(sizeof(char) * 16);
printf("p1: 0x%p\n", p1);
printf("p2: 0x%p\n", p2);
printf("p3: 0x%p\n", p3);
while(1)
{
}
}
程序定义了3个静态变量和3个指针,并输出地址,结果如下
发现静态变量储存到了静态区,地址依次增加。指针储存到了堆中,地址依次增加。
各个内存地址基本符合下图