认识c语言的内存四区

内存四区

  内存四区,分别是全局区(静态区),代码区,栈区,堆区.
  从内存分配来看,可以分为静态分配和动态分配.

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

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

 动态分配 内存使用完成以后,可以被回收在使用

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

 看图,强化一下记忆


全局区

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("\n\n\n");
	show();

	system("pause");
	return 0;
}

代码区

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

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

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

栈区

void stack(int x)
{
	//x arr在离开作用域(方法)就回被回收掉
	int arr[] = { 1,2,3 };
	printf("%p,%p\n", &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;
}

本想通过录屏生成gif图,没找到合适的工具的,等找到合适的工具在补一篇

秋风 2016-09-07