您的位置:首页 > 编程语言 > C语言/C++

C语言中的内存四区与函数调用模型

2018-02-06 11:02 519 查看
首先记录一下内存四区:

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中,虚拟机会自动管理。此区域主要用来存放我们经常创建的对象、动态的申请的临时空间等。

全局区:存放一些全局的东西,比如我们经常用到的静态变量、全局变量等都会存放到全局区。

下图就表明了变量之间的关系:





哈哈我的绘画功底一般般!但是重点都在图上了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆栈 内存四区