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

一、简介

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

在这里插入图片描述
可以看到全局变量地址如下所示:
在这里插入图片描述

(二)局部变量

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中有四种类型的变量:局部变量全局变量、静态局部变量和静态全局变量。 1. 局部变量(Local Variables): 局部变量是在函数内部声明的变量,它们只在函数内部可见和访问。局部变量的作用域仅限于声明它们的函数内部。当函数执行完毕后,局部变量会被销毁,其占用的内存也会被释放。 2. 全局变量(Global Variables): 全局变量是在函数外部声明的变量,它们可以被程序中的所有函数访问。全局变量的作用域从声明开始的地方一直延伸到文件的末尾。全局变量在整个程序的执行过程中都是存在的,因此会占用内存。需要注意的是,在多个文件中使用同名的全局变量会导致冲突,因此应该避免这样的情况发生。 3. 静态局部变量(Static Local Variables): 静态局部变量与普通局部变量相似,都是在函数内部声明。不同之处在于,静态局部变量只会在首次进入该函数时进行初始化,之后的函数调用不会重新初始化该变量。同时,静态局部变量的作用域仍然限制在声明它们的函数内部,但是其生命周期会延长到整个程序的执行过程。 4. 静态全局变量(Static Global Variables): 静态全局变量与普通全局变量相似,都是在函数外部声明。不同之处在于,静态全局变量只能在声明它们的文件内部访问,其作用域被限制在当前文件范围内。其他文件无法访问该变量。静态全局变量会在程序开始执行时进行初始化,并且在整个程序执行期间都存在。 以上就是C语言中四种不同类型的变量:局部变量全局变量、静态局部变量和静态全局变量的特点和用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值