前言
內(nèi)存四區(qū),分別是全局區(qū)(靜態(tài)區(qū)),代碼區(qū),棧區(qū),堆區(qū).
從內(nèi)存分配來看,可以分為靜態(tài)分配和動態(tài)分配.
靜態(tài)分配
內(nèi)存分配完成之后,不會釋放,直到程序結(jié)束
- 靜態(tài)區(qū),分配之后,不會釋放,可讀可寫
- 代碼區(qū),一旦分配,可讀不可寫,不能修改
動態(tài)分配
- 棧區(qū),系統(tǒng)自動分配和釋放
- 堆區(qū),手動分配和手動釋放
看圖,強(qiáng)化一下記憶
內(nèi)存四區(qū)
全局區(qū)(靜態(tài)區(qū))
int num = 10; //靜態(tài)分配,不回收
void show()
{
int data = 15; //動態(tài)分配,離開作用域就釋放,可以通過內(nèi)存監(jiān)視
printf("%p,%p", &num, &data); //根據(jù)打印的地址,通過內(nèi)存1和內(nèi)存2查看全局變量和局部變量的聲明周期
num = 20;
data = 30;
printf("n");
}
int main(int argc, char *argv[])
{
show();
printf("nnn");
show();
system("pause");
return 0;
}
代碼區(qū)(只讀,不可寫入)
void code()
{
printf("hello world!n");
}
int main(int argc, char *argv[])
{
//根據(jù)打印的地址0x0C71850 通過反匯編窗口 輸入0x0C71850 會發(fā)現(xiàn)自動改為_code(),證明函數(shù)名就是地址
printf("%pn", code);
char *p;
scanf("%p", &p); //輸入打印的地址
printf("[%c]", *p);
*p = 'a'; //引發(fā)了異常: 寫入訪問權(quán)限沖突,證明代碼區(qū)是可讀不可寫
system("pause");
return 0;
}通過指針獲取方法(地址),寫入數(shù)據(jù),報訪問權(quán)限沖突
棧區(qū)
void stack(int x)
{
//x arr在離開作用域(方法)就回被回收掉
//可以在內(nèi)存中,
int arr[] = { 1,2,3 };
printf("%p,%pn", &x, &arr);
}
int main(int argc, char *argv[])
{
stack(1);
system("pause");
return 0;
}
堆區(qū)
void heap()
{
//手動在堆區(qū)分配10兆
void *ptemp = malloc(1024 * 1024* 10);
if (ptemp!=NULL)
{
//根據(jù)分配好的地址,釋放分配的內(nèi)存,可以通過任務(wù)管理器監(jiān)視程序所占內(nèi)存
free(ptemp);
}
}
int main(int argc, char *argv[])
{
heap();
printf("n");
heap(); //查看任務(wù)管理器,看運行內(nèi)存大小
system("pause");
return 0;
}
本文是2016.09.07,是當(dāng)時學(xué)C語言記錄下的筆記,本想每天寫一篇博文,有些吃力,還是遷移文章來的實在.






