前言内存四区,分别是全局区(静态区),代码区,栈区,堆区.
从内存分配来看,可以分为静态分配和动态分配.
静态分配【认识c语言的内存四区】内存分配完成之后,不会释放,直到程序结束
- 静态区,分配之后,不会释放,可读可写
- 代码区,一旦分配,可读不可写,不能修改
- 栈区,系统自动分配和释放
- 堆区,手动分配和手动释放
文章插图
内存四区
全局区(静态区)
int num = 10;//静态分配,不回收void show(){ int data = https://www.isolves.com/it/cxkf/yy/C/2022-03-30/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语言记录下的笔记,本想每天写一篇博文,有些吃力,还是迁移文章来的实在.推荐阅读
- 男生聊天喜欢上你的征兆 男人在微信中和你聊天
- 电风扇要变天!竞争对手强势崛起,美的老大位置还能坐多久?
- 玻色因可以修复凹陷脸颊吗,含有玻色因的品牌有哪些
- 视频怎么加水印?快来学这个简单好用的方法
- 跟异性分享日常算暧昧吗,两个人互有感觉的细节有哪些
- 男生把车给女生开意味着什么,爱你的男人会把车让给你开吗
- 为什么说鲸鱼一生孤独,鲸落的寓意和象征有哪些
- 男朋友不馋我身子是什么情况,睡一起却不碰你的男人心理
- 免费开源的PS替代品来了?给PS点面子吧
- 打造个人品牌的五个步骤