C语言中的内存四区与函数调用模型
2018-02-06 11:02
519 查看
首先记录一下内存四区:
heap(堆区):malloc\new\delete\操作系统管理
stack(栈区 ):程序局部变量
global(全局区):常量和全局变量,静态变量,文字常量区 \操作系统管理
code(代码区):操作系统管理
全局区:文字常量区,静态变量,全局变量
堆区:没啥好说的,内存操作全在自己掌控之中
详细一点的说法:
栈区:由系统的编译器自动的释放,主要用来存放方法中的参数,一些临时的局部变量等,并且方法中的参数一般在操作完后,会由编译器自动的释放掉。
堆区:由程序员决定,在Java中,虚拟机会自动管理。此区域主要用来存放我们经常创建的对象、动态的申请的临时空间等。
全局区:存放一些全局的东西,比如我们经常用到的静态变量、全局变量等都会存放到全局区。
下图就表明了变量之间的关系:
哈哈我的绘画功底一般般!但是重点都在图上了!
heap(堆区):malloc\new\delete\操作系统管理
stack(栈区 ):程序局部变量
global(全局区):常量和全局变量,静态变量,文字常量区 \操作系统管理
code(代码区):操作系统管理
全局区:文字常量区,静态变量,全局变量
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //全局区:文字常量区,静态变量,全局变量 char* get_str1() { char *p= "hello";//文字常量区 return p; } char* get_str2() { char *q = "hello";//文字常量区 return q; } int* get_int() { static int a = 100;//静态变量 return &a; } int global = 100;//全局变量 int main(void) { char* p = NULL; char*q = NULL; p = get_str1(); q = get_str2(); //%s打印指针指向内容 //%d打印指针本身的值 printf("p=%s,p=%d\n",p,p); printf("q=%s,q=%d\n",q,q); //两者的内存地址一样的,因为返回的都是文字常量区的"hello"的地址 int* i = get_int(); printf("static a =%d\n",*i); const double PI = 3.14;//常量 system("pause"); return 0; }栈区:程序局部变量
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> char* get_str() { char str[] = "abcdefg";//虽然"abcdefg"在文字常量区有一份, //但是编译器会把文字常量区的内容copy到str[]中,由于get_str()只是个函数在栈区, //用完就被释放,丢失了对那块内存的占有权,可能内容没有改变也可能改变了,这个时候返回的地址就是一个指向不明确内容的地址 return str; } int main(void) { char buf[128] = { 0 }; //strcpy(buf, get_str()); //printf("buf=%s\n",buf);//打印出来可能是是乱码 char*p = NULL;//或者说我们不经过copy直接通过地址打印 p = get_str(); printf("p=%s\n",p); system("pause"); return 0; }这是一个很经典的例子,get_str()函数返回的绝对不是全局区的文字常量区的内存地址,而是栈区的地址,方法调用完毕栈区内存释放,指针指向的地址所存储的东西就可能会发生改变,所以出现乱码在情理之中!
堆区:没啥好说的,内存操作全在自己掌控之中
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> char* get_str() { char* temp = (char*)malloc(100); if (temp != NULL) { strcpy(temp, "abcdefg"); } return temp; } int main(void) { char *p = get_str(); if (p != NULL) { printf("p=%s\n",p); free(p); p = NULL; } system("pause"); return 0; }代码区:由操作系统控制,存放程序编译后可以执行代码的地方。比如执行代码时写的While语句、if条件语句等,都会存放到此。
详细一点的说法:
栈区:由系统的编译器自动的释放,主要用来存放方法中的参数,一些临时的局部变量等,并且方法中的参数一般在操作完后,会由编译器自动的释放掉。
堆区:由程序员决定,在Java中,虚拟机会自动管理。此区域主要用来存放我们经常创建的对象、动态的申请的临时空间等。
全局区:存放一些全局的东西,比如我们经常用到的静态变量、全局变量等都会存放到全局区。
下图就表明了变量之间的关系:
哈哈我的绘画功底一般般!但是重点都在图上了!
相关文章推荐
- C语言之内存四区模型和函数调用模型
- C语言之内存四区模型和函数调用模型
- C语言之内存四区模型和函数调用模型
- iOS小明开发笔记(二十二) (C语言之内存四区和函数调用模型)
- C语言之内存四区模型和函数调用模型
- iOS陆哥开发笔记(二十四) (C语言之内存四区和函数调用模型)
- C语言变量 常量 内存四区 函数调用模型
- C语言提高之技术模型层次、学习标准、特点、内存四区、函数调用模型
- C语言之指针专题三:理解指针要和内存四区模型和函数调用模型相结合
- iOS海哥开发笔记 (海哥原创,C语言之内存四区模型和函数调用模型)
- <2> 内存四区和函数的调用模型
- C语言模型:内存四区模型和函数调用模型
- c++学习笔记 内存四区 函数调用模型 指针强化
- c++学习笔记 内存四区 函数调用模型 指针强化
- C语言之指针专题三:理解指针要和内存四区模型和函数调用模型相结合
- 【C语言提高04】程序的内存四区模型
- 函数的调用及其内存模型
- C++类对象内存模型与成员函数调用分析(上)
- C语言,题目:函数调用,内存,malloc找错
- 关于C语言中一,二级指针函数中的使用和c语言中和函数发生调用时,实参和形参都会占用内存吗?