内存四区,分别是全局区(静态区),代码区,栈区,堆区.
从内存分配来看,可以分为静态分配和动态分配.
内存分配完成之后,不会释放,直到程序结束
内存四区
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;
}
通过指针获取方法(地址),写入数据,报访问权限冲突
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语言记录下的笔记,本想每天写一篇博文,有些吃力,还是迁移文章来的实在.