C语言内存四区 内存四区概述
1.代码区放函数,是操作系统管理一般不需要管,因为它的汇编,函数指针操作的是代码区。 2.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值,其操作方式类似于数据结构中的栈。需要由汇编操控,C语言无法操控。 3.堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS(操作系统)回收。它和数据结构的堆是两回事。 4.全局区/静态区(static):存放常量和全局变量,初始化的在一块区域,未初始化的在另外一块区域。程序结束后由系统释放。 全局区 char *pMem1() { //字符串是如何存在指针里的 char *p1=”guoguo”; return p1; }//函数调用完毕,内存就销毁了。 //只是存了个地址,变量是在全局区 char *pMem2() { //两个不同的函数定义了一个相同的字符串,地址一样吗 char *p2=”guoguo”; return p2; }//因为全局区的内容一样,所以这个函数也只是保存了全局区的地址,故和pMen1的地址一样 int main(void) { char *p1=NULL; char *p2=NULL; p1=pMem1(); p2=pMem2(); printf(“p1=%s,p1=%p”,p1,p1); printf(“p2=%s,p2=%p”,p2,p2); //打印出来的结果地址和值都一样 }
数据存在全局区,但把地址赋值给了指针变量 指针指向谁就把谁的地址赋值给指针
栈区的特点:当栈区的函数执行完毕的时候,变量就销毁掉了
栈区 在栈区开辟的数组会被系统自动销毁 char *p_str() { char str[100] = “guoguo”; //指针是四个字节,四个字节不能存储字符串,数组是100个字节,字符串存在栈区 return str; } int main(void) { char *p = NULL; p = p_str();//栈区销毁了 printf(“p=%s\n”,p);//p是数组的首地址 //%s是打印地址所指向内存空间的数据 }
因为p_str申明的是数组,所以是把全局区的数据拷贝到栈区,是复制了全局变量的内容,和地址无关
栈区销毁了,所以查找的时候会有乱码 %s是打印地址所指向内存空间的数据 堆区 char *phead() { char *tmp = (char *)malloc(100) if(tmp == NULL) { return NULL; } strcpy(tmp,”guoguo”) //原型声明:char *strcpy(char *dest,const char *stc) 把从stc地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间 } int main(void) { char *p = NULL; p = phead(); if(p!=NULL) { printf(“%s\n”,p) free(p); p=NULL; } }
free的意思不是清空内存,而是解除与指针的绑定关系,原先main函数可以通过指针找到堆区的地址,现在把main函数指向堆区的指针给断掉了,后续往堆区加东西里面的数据就会被覆盖掉
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/62195.html