内存四区模型

注:一个程序只建立一个内存四区,所有函数共用这个内存四区。

内存四区如下:

一、全局区

全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,

未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,

该区域在程序结束后由操作系统释放;

常量区——字符串常量和其他常量的存储位置,程序结束后由操作系统释放。

在代码运行期间,C编译器会做优化处理,

1)、当定义两个不同字符串时,全局区会开辟两个内存空间存放字符串,

2)、当定义两个相同的字符串时,全局区只开辟一个内存空间,变量共用这个内存空间。

二、堆

一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能有操作系统回收;

函数内部动态分配内存空间,其他函数可以使用,因为在该函数运行结束后,这片内存空间不被释放。

三、栈(临时区)

由编译器自动分配释放,存放函数的参数值,局部变量的值等;

函数内部静态分配内存空间,其他函数不能使用,因为在该函数运行结束后,这片内存空间被释放掉了。

四、代码区

存放函数的二进制代码;

栈区开口朝向问题:

#include <stdio.h>

void main(void){
    int i=10;
    int j=10;
    printf("i-->%d;\n",&i);
    printf("j-->%d;\n",&j);
    if((&i-&j)>0){
        printf("开口朝下;\n");
    }else if ((&i-&j)<0){
        printf("开口朝上;\n");
    }else{
        printf("error;\n");
    }
    return ;
}

无论栈区开口朝上还是朝下,栈区内的数组内存空间的开头地址都是最下面的,如图:

时间: 2024-08-05 22:22:12

内存四区模型的相关文章

c语言内存四区模型

c语言内存四区模型:代码区,全局区(常量区),栈区,堆区 在全局区(常量区),两个字符串完全一样c++编译器只会定义一份 char * getBuf() { char buf[20]; strcpy(buf, "abcde"); return buf; } abcdX?  有乱码! 确实把内存地址返回了,但不能用 被调函数调用完毕,在临时区分配的内存统统消失 char *buf= (char *)malloc(sizeof(char)*20); 手动malloc申请一份内存,由程序员手

内存四区模型与指针

数据类型的封装 1.void的字面意思是"无类型",void 则为"无类型指针",void 可以指向任何类型的数据. 2.用法1:数据类型的封装 int InitHardEnv(void **handle); 典型的如内存操作函数memcpy和memset的函数原型分别为 void * memcpy(void *dest, const void *src, size_t len); void * memset ( void * buffer, int c, size

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

首先是操作系统将代码程序加载到内存中 然后将内存分为4个区 栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放. 堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构. 全局区,静态区,常量区(字符串存放的位置),程序结束后,有操作系统释放 代码区,存放函数体的二进制代码. 最后,操作系统找到main函数的入口,就开始代码的执行. 一般内存四区中的栈的开口方向是向下的.为什么要这样设计呢,因为设计栈的方向向下,可以给应用程序设定栈的大小,这样就可以避免栈溢出. 不管

C语言提高之技术模型层次、学习标准、特点、内存四区、函数调用模型

1.C语言技术模型分层: 其中,接口的封装和设计尤为重要! 2.着重需要培养的能力 (1)接口的封装和设计(业务模型的抽象.功能抽象和封装) ---重中之重! a.接口api的使用能力: b.接口api的查找能力(快速上手): c.接口api的实现能力: // SOCKETCLIENT_H,一个简单信息系统的封装接口 #ifndef _SOCKETCLIENT_H #endif _SOCKETCLIENT_H #ifdef __cplusplus extern "C" { #endif

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

C语言提高笔记 标签(空格分隔): C++ C语言 day1 数组做函数参数的退回问题 数组做函数参数会退回为一个指针, 正确做法:把数组的内存首地址和数组的有效长度传给被调用函数. 实参的a 和 形参的a 的数据类型本质不一样, 形参中的数组,编译器会把它当成指针处理 只会分配四个字节. 形参写在函数上,和写在函数内是一样的,只不过是具有对外的属性而已. 数据类型本质分析 数据类型可理解为创建变量的模具(模子):是固定内存大小的别名: 数据类型的作用:编译器预算对象(变量)分配的内存空间大小

面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期

1.面向对象主要涉及  构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联性. 在C++中,通过抽象数据类型(abstract data type, ADT),在类中定义数据和函数,来实现数据和函数直接的绑定. C++成员数据:static.nonstatic C++成员函数:static.nonstatic.virtual C++中的类class从面向对象理论出发,将变

C++ 数据类型提高+内存四区

# 这一章节全部是C语言的内容# 数据类型提高**注意**1.数组作为形参会退化为指针(验证,传参后用sizeof进行打印,可以看出打印出数组的字节为一字节)2.形参在函数上和函数内是一样的,只不过对外开放 # 内存四区 ##### 数组和数组元素指针```void main(){ int a;//告诉编译器分配4个字节内存 int b[10];//告诉编译器自己分配40个内存 printf("b:%d,b+1:%d,&b:%d,&b+1:%d",b,b+1,&

深入理解数据类型、变量类型属性、内存四区和指针

数据类型可理解为创建变量的模具(模子):是固定内存大小的别名. 数据类型的作用:编译器预算对象(变量)分配的内存空间大小. 既能读又能写的内存对象,称为变量:若一旦初始化后不能修改的对象则称为常量. 变量本质:(一段连续)内存空间的别名. 内存四区 栈区(stack):也叫临时区,由编译器自动分配释放,存放函数的参数值,局部变量的值等. 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收. 全局区(静态区)(static):全局变量和静态变

C 提高1 内存四区 变量本质 栈开口方向 指针铁律1

C 提高第一天复习 内存四区,变量常量的本质,函数调用模型,栈开口方向,指针铁律1,指针是一种数据类型 C 提高学员标准:写一个标准的冒泡排序 选择法或者冒泡法排序 在一个函数内排序 通过函数调用的方式排序 数组做函数参数的技术盲点和推演 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i = 0; int j = 0; int tmp = 0; int a[] =