变量存放的内存五大区

变量存放的内存五大区

栈区
用于存储局部变量,其存放数据结构和数据结构中的栈相同。

堆区:
用于存放自助申请的空间,如malloc/new,其存放数据结构类似于链表

全局静态区:
用于存放静态变量和全局变量,分为DATA段和BSS段,其中DATA段存放已经被初始化的静态变量或全局变量;BSS段存放还未被初始化的全局或静态变量。
注意,BSS段中的初始化只会执行一次,在程序执行之前会全部赋值0。而已初始化的变量则是在程序执行之前先放入DATA段中。

文字常量区:
存放不能修改的常量。

代码区(也有说是自由存储区):
存放代码。其中需要注意加了static 修饰的函数仍然是在代码区。

#include <stdlib.h>
#include <stdio.h>
char x1 = 1;//全局区 DATA段
char x2 = 2;

int y1;//全局区 BSS段
int y2;

static int x3 = 3; //全局区 Data段
static int x4 = 4;

static int y3;//全局区 BSS段
static int y4;

void f() {

}

int main() {
	printf("================栈区========================\n");
	int a;
	char b = 'a';
	char c[10] = "asdf";
	int *p = &a;
	printf("a在栈区:%p\n", &a);
	printf("b在栈区:%p\n", &b);
	printf("c在栈区:%p\n", &c);
	printf("p在栈区:%p\n", &p);

	printf("================堆区========================\n");
	int *q1 = (int*)malloc(sizeof(int));
	int *q2 = (int*)malloc(sizeof(int));
	printf("q1在堆区:%p\n", q1);
	printf("q2在堆区:%p\n", q2);
	free(q1), free(q2);

	printf("================全局区========================\n");
	printf("x1在全局区 DATA段:%p\n", &x1);
	printf("x2在全局区 DATA段:%p\n", &x2);
	printf("y1在全局区 BSS段:%p\n", &y1);
	printf("y2在全局区 BSS段:%p\n", &y2);
	printf("用static修饰之后\n");
	printf("x3在全局区 DATA段:%p\n", &x3);
	printf("x4在全局区 DATA段:%p\n", &x4);
	printf("y3在全局区 BSS段:%p\n", &y3);
	printf("y4在全局区 BSS段:%p\n", &y4);
	
	printf("================文字常量区========================\n");
	const char *s1 = "asdfsfsda";
	const char *s2 = "fsd";
	printf("s1在文字常量区:%p\n", s1);
	printf("s2在文字常量区:%p\n", s2);

	printf("================程序区========================\n");
	printf("main函数放在程序区:%p\n", &main);
	printf("f函数放在程序区:%p\n", &f);
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值