`
cscoder
  • 浏览: 15881 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

C语言内存模型(内存组织方式)

 
阅读更多
我们知道,C程序开发并编译完成后,要载入内存(主存或内存条)才能运行(请查看:载入内存,让程序运行起来),变量名、函数名都会对应内存中的一块区域。

内存中运行着很多程序,我们的程序只占用一部分空间,这部分空间又可以细分为以下的区域:
内存分区 说明
程序代码区(code area) 存放函数体的二进制代码
静态数据区(data area) 也称全局数据区,包含的数据类型比较多,如全局变量、静态变量、一般常量、字符串常量。其中:
  • 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
  • 常量数据(一般常量、字符串常量)存放在另一个区域。

注意:静态数据区的内存在程序结束后由操作系统释放。
堆区(heap area) 一般由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收。malloc()calloc()free() 等函数操作的就是这块内存,这也是本章要讲解的重点。

注意:这里所说的堆区与数据结构中的堆不是一个概念,堆区的分配方式倒是类似于链表。
栈区(stack area) 由系统自动分配释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。
命令行参数区 存放命令行参数和环境变量的值,如通过main()函数传递的值。

C语言内存模型示意图
图1:C语言内存模型示意图

提示:关于局部的字符串常量是存放在全局的常量区还是栈区,不同的编译器有不同的实现,VC 将局部常量像局部变量一样对待,存储于栈(⑥区)中,TC则存储在静态数据区的常量区(②区)。

注意:未初始化的全局变量的默认值是 0,而未初始化的局部变量的值却是垃圾值(任意值)。请看下面的代码:

    #include <stdio.h>
    #include <conio.h>
    int global;
    int main()
    {
        int local;
        printf("global = %d\n", global);
        printf("local = %d\n", local);
        getch();
        return 0;
    }

运行结果:
global = 0
local = 1912227604

为了更好的理解内存模型,请大家看下面一段代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int a = 0;  // 全局初始化区(④区)
    char *p1;  // 全局未初始化区(③区)
    int main()
    {
        int b;  // 栈区
        char s[] = "abc";  // 栈区
        char *p2;  // 栈区
        char *p3 = "123456"; // 123456\0 在常量区(②),p3在栈上,体会与 char s[]="abc"; 的不同
        static int c = 0;  // 全局初始化区
        p1 = (char *)malloc(10),  // 堆区
        p2 = (char *)malloc(20);  // 堆区
        // 123456\0 放在常量区,但编译器可能会将它与p3所指向的"123456"优化成一个地方
        strcpy(p1, "123456");
    }


分享到:
评论

相关推荐

    C语言标准和实现 Volume1

    这些标准定义了C语言的语法、类型系统、内存模型、控制流以及库函数等核心概念。学习C语言标准有助于开发者编写更具有移植性和效率的代码,确保程序在不同平台上的一致性。 C语言中的数值运算包括基本算术运算(加...

    C语言讲义v1.doc

    - 学习C语言的内层模型,即了解计算机的内存结构、存储机制以及处理器如何执行指令,有助于编写更高效、更安全的代码。 6. **链表结构与排序算法**: - 链表是C语言中常见的数据结构,包括单链表、双链表等,用于...

    c语言编程宝典大全c语言编程宝典大全

    理解指针的内存模型,学习如何声明、赋值和使用指针,以及指针与数组、函数的关联,对于提高编程效率和解决复杂问题至关重要。特别地,指针在动态内存分配(如malloc和free)中的作用不容忽视。 结构体和联合体允许...

    C语言通用范例开发金典

    最后,理解C语言的内存模型和内存管理是成为高级C程序员的关键。书中可能会涵盖堆栈、堆和静态存储区的区别,以及如何有效地管理内存,防止内存泄漏。 总的来说,《C语言通用范例开发金典》是一本全面的教程,不仅...

    随机森林(C语言)

    随机森林是一种集成学习方法,由Leo Breiman在2001年提出,它结合了决策树的优势并引入了随机化机制以提高模型的预测能力和泛化能力。在C语言实现的背景下,我们可以深入理解随机森林的基本原理以及如何在实际项目中...

    C语言项目开发

    2. **函数**:C语言中的函数是代码组织的基本单元,它们可以接受参数并返回值。理解如何定义和调用函数,以及如何处理函数指针,是C语言项目开发的重要技能。 3. **内存管理**:C语言允许程序员直接操作内存,包括...

    经典的c语言豪华教程

    结构体常用于表示复杂的数据模型,如文件系统中的文件信息,而联合体则提供了共享同一块内存空间的不同数据类型的方法。 预处理器是C语言的另一个特色,它在编译前对源代码进行处理,如包含头文件、宏定义等。学习...

    C语言 公共部分 C语言二级

    数据结构是组织和管理数据的方式,包括数组、链表、栈、队列、树等。在C语言中,我们通过结构体和指针来实现这些数据结构。算法则是解决问题或执行任务的步骤序列,如排序算法(冒泡排序、快速排序)、查找算法...

    趣味C++程序 单片机c语言编程实例 单片机c语言入门

    然后,需要熟悉单片机的内部结构和工作原理,包括CPU、内存模型、中断系统等。了解特定单片机的开发板和相关工具链,如IDE、编译器、调试器,以及如何编写和烧录固件。同时,学习单片机的I/O操作,例如读写GPIO、...

    标准C语言实用全书

    数据结构是编程中的核心概念之一,它决定了数据在计算机中的组织方式。在这部分,读者将会学习到数组、链表、堆栈、队列、双端队列、多重树、图和图库等数据结构。每种数据结构都有其特定的用途和优势,通过学习这些...

    C语言程序设计电子书

    在结构化数据方面,本书会介绍C语言中的结构体、联合体和枚举类型,这些都是组织复杂数据结构的关键工具。通过学习这些,读者能更好地处理各种复杂的数据模型。 电子书还将涵盖预处理器、文件操作等进阶主题。预...

    C语言接口与实现C语言接口与实现C语言接口与实现

    数据结构定义则构成了程序内部的数据模型,通过指针和结构体,C语言能够实现复杂的数据组织形式。 接口的设计应该遵循一些原则,例如清晰性、简洁性和一致性。清晰的接口使得其他程序员能够快速理解其用途;简洁的...

    C语言深度剖析

    8. **内存模型与数据对齐**:深入理解C语言的内存模型能帮助你优化程序性能。书中会探讨内存布局、数据对齐的原则和影响,以及如何通过pragma指令进行对齐控制。 9. **异常处理**:虽然C语言没有内置的异常处理机制...

    C语言嵌入式系统编程修炼_C语言_linux_

    接下来,了解并掌握结构体和联合体能帮助开发者组织复杂的数据结构。结构体允许将不同类型的数据组合在一起,而联合体则可以在相同的内存空间中存储不同类型的变量。这对于创建定制的数据模型非常有用,尤其是在硬件...

    哈尔滨工业大学C语言题库

    这是C语言程序的标准执行模型。这意味着无论`main`函数在程序中的位置如何,程序的执行都将从`main`函数的第一条语句开始,并在`main`函数的最后一条语句处结束。这一规则确保了程序执行的一致性和可预测性。 ### 2...

    c语言高级应用程序

    理解不同平台的差异,如文件路径格式、线程模型和内存管理,是编写可移植代码的关键。 通过深入学习和实践这些知识点,开发者能够驾驭C语言,编写出高效、稳定的高级应用程序,满足各种复杂的需求。这份资料将是你...

    C语言程序设计_谭浩强

    《C语言程序设计_谭浩强》是一本经典的C语言学习教材,由谭浩强先生编著。这本书针对初学者,深入浅出地介绍了...同时,对于初学者来说,理解C语言的底层工作原理,如内存模型和计算机体系结构,也会对学习大有裨益。

    零基础入门C语言-王桂林 -v2-.pdf

    书籍内容涵盖了C语言的多个基础知识点,包括编程环境的搭建、Linux基础命令、C语言的基本语法、数据类型、变量、内存模型、运算符和表达式等。下面详细展开介绍这些知识点。 首先,书中提到了C语言的入门示例——...

    复旦大学计算机系C语言课程ppt(有源代码)

    在学习过程中,理解C语言的内存模型和作用域规则也是关键。PPT会详细解释栈和堆的区别,以及局部变量和全局变量的生命周期。同时,了解如何有效地管理和释放动态内存,避免内存泄漏,对于编写健壮的C程序至关重要。 ...

Global site tag (gtag.js) - Google Analytics