前言
內存四區,分別是全局區(靜態區),代碼區,棧區,堆區.
從內存分配來看,可以分為靜態分配和動態分配.
靜態分配
內存分配完成之后,不會釋放,直到程序結束
- 靜態區,分配之后,不會釋放,可讀可寫
- 代碼區,一旦分配,可讀不可寫,不能修改
動態分配
- 棧區,系統自動分配和釋放
- 堆區,手動分配和手動釋放
看圖,強化一下記憶
內存四區
全局區(靜態區)
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語言記錄下的筆記,本想每天寫一篇博文,有些吃力,還是遷移文章來的實在.