<返回更多

认识c语言的内存四区

2022-03-30    秋风技术
加入收藏

前言

内存四区,分别是全局区(静态区),代码区,栈区,堆区.

从内存分配来看,可以分为静态分配和动态分配.

静态分配

内存分配完成之后,不会释放,直到程序结束

  1. 静态区,分配之后,不会释放,可读可写
  2. 代码区,一旦分配,可读不可写,不能修改

动态分配

  1. 栈区,系统自动分配和释放
  2. 堆区,手动分配和手动释放

看图,强化一下记忆

认识c语言的内存四区

内存四区

全局区(静态区)

int num = 10;  //静态分配,不回收

void show()
{
	int data = 15;	//动态分配,离开作用域就释放,可以通过内存监视 
	printf("%p,%p", &num, &data);	//根据打印的地址,通过内存1和内存2查看全局变量和局部变量的声明周期

	num = 20;
	data = 30;
	printf("n");
}

int main(int argc, char *argv[])
{
	show();
	printf("nnn");
	show();

	system("pause");
	return 0;
}

代码区(只读,不可写入)

void code()
{
	printf("hello world!n");
}

int main(int argc, char *argv[])
{
  	//根据打印的地址0x0C71850 通过反汇编窗口 输入0x0C71850 会发现自动改为_code(),证明函数名就是地址
	printf("%pn", code);
	char *p;
	scanf("%p", &p);		//输入打印的地址
	printf("[%c]", *p);

	*p = 'a';		//引发了异常: 写入访问权限冲突,证明代码区是可读不可写
	system("pause");
	return 0;
}
认识c语言的内存四区

通过指针获取方法(地址),写入数据,报访问权限冲突

栈区

void stack(int x)
{
	//x arr在离开作用域(方法)就回被回收掉
  //可以在内存中,
	int arr[] = { 1,2,3 };
	printf("%p,%pn", &x, &arr);
}

int main(int argc, char *argv[])
{
	stack(1);
	system("pause");
	return 0;
}

堆区

void heap()
{
	//手动在堆区分配10兆
	void *ptemp = malloc(1024 * 1024* 10);

	if (ptemp!=NULL)
	{
		//根据分配好的地址,释放分配的内存,可以通过任务管理器监视程序所占内存
		free(ptemp);
	}
}

int main(int argc, char *argv[])
{
	heap();		
	printf("n");
	heap();			//查看任务管理器,看运行内存大小
	system("pause");
	return 0;
}

本文是2016.09.07,是当时学C语言记录下的笔记,本想每天写一篇博文,有些吃力,还是迁移文章来的实在.

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>