欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言程序里全局变量、局部变量、堆、栈

程序员文章站 2024-01-28 17:14:46
...

一、简介

C语言在内存中一共分为如下几个区域,分别是:

  1. 内存栈区: 存放局部变量名;
  2. 内存堆区: 存放new或者malloc出来的对象;
  3. 常数区: 存放局部变量或者全局变量的值;
  4. 静态区: 用于存放全局变量或者静态变量;
  5. 代码区:二进制代码。

二、代码调试

(一)全局变量

#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;
}

C语言程序里全局变量、局部变量、堆、栈
可以看到全局变量地址如下所示:
C语言程序里全局变量、局部变量、堆、栈

(二)局部变量

#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); 
}

可以看到局部变量地址如下所示:
C语言程序里全局变量、局部变量、堆、栈
从这两个代码来看,在主函数前定义全局变量,在函数里面定义局部变量。

三、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语言程序里全局变量、局部变量、堆、栈

四、总结

通过本次对C语言程序里全局变量、局部变量、堆、栈的复习与使用,原本遗忘的知识又重拾起来,了解清楚这些概念对相关程序代码的提升有很大的作用,可以用相关特性实现一些功能,可以使得代码效率更高。

相关标签: c语言 嵌入式