C语言程序里全局变量、局部变量、堆、栈
程序员文章站
2024-01-28 17:14:46
...
C语言程序里全局变量、局部变量、堆、栈
一、简介
C语言在内存中一共分为如下几个区域,分别是:
- 内存栈区: 存放局部变量名;
- 内存堆区: 存放new或者malloc出来的对象;
- 常数区: 存放局部变量或者全局变量的值;
- 静态区: 用于存放全局变量或者静态变量;
- 代码区:二进制代码。
二、代码调试
(一)全局变量
#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;
}
可以看到全局变量地址如下所示:
(二)局部变量
#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);
}
可以看到局部变量地址如下所示:
从这两个代码来看,在主函数前定义全局变量,在函数里面定义局部变量。
三、stm32系中的局变量、局部变量、堆、栈
(二)全局变量、局部变量
在下上一篇博客中,用到了串口通信的程序代码,本次还是使用同一程序代码,
其中只需要将主函数变为如下代码即可。
#include "stm32f10x.h"
#include "bsp_usart.h"
char s1[16];
char s2[16];
char s3[16];//全局变量
void main()
{
char a1[16];
char a2[16];
char a3[16];//局部变量
USART_Config();
printf("全局变量的地址是");printf("\n");
printf("0x%p\n",s1);
printf("0x%p\n",s2);
printf("0x%p\n",s3);
printf("局部变量的地址是");printf("\n");
printf("0x%p\n",a1);
printf("0x%p\n",a2);
printf("0x%p\n",a3);
while(1)
{
}
}
(二)静态变量、指针
需要再次修改代码,将主函数变为如下代码即可。
#include "stm32f10x.h"
#include "bsp_usart.h"
static char s1[16];
static char s2[16];
static char s3[16];//静态全局变量
void main()
{
static char a1[16];
static char a2[16];
static char a3[16];//静态局部变量
char *p1;
char *p2;
char *p3;//指针变量
USART_Config();
printf("全局变量的地址是");printf("\n");
printf("0x%p\n",s1);
printf("0x%p\n",s2);
printf("0x%p\n",s3);
printf("局部变量的地址是");printf("\n");
printf("0x%p\n",a1);
printf("0x%p\n",a2);
printf("0x%p\n",a3);
p1= (char *)malloc(sizeof(char) *16);
p2= (char *)malloc(sizeof(char) *16);
p3= (char *)malloc(sizeof(char) *16);
printf("指针变量的地址是");printf("\n");
printf("0x%p\n",p1);
printf("0x%p\n",p2);
printf("0x%p\n",p3);
while(1)
{
}
}
(三)结果
四、总结
通过本次对C语言程序里全局变量、局部变量、堆、栈的复习与使用,原本遗忘的知识又重拾起来,了解清楚这些概念对相关程序代码的提升有很大的作用,可以用相关特性实现一些功能,可以使得代码效率更高。