热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c内存分布

在内存中程序分别存储在如下几个区域中:1)代码段或者正文区(CodeorText)但是实质都是一样的,都是用来存放程序语句进行编译后,形成机器的代码。一般此内存区是只读的,防止程序

在内存中程序分别存储在如下几个区域中:
1) 代码段 或者 正文区(Code or Text)
但是实质都是一样的,都是用来存放程序语句进行编译后,形成机器的代码。一般此内存区是只读的,防止程序意外修改指令。

2) 初始数据段(RO/RW data segment)
这一段其实有两个段,一个RO段,一个Data段.
通常是用来存放程序中已初始化的全局变量的一块内存区域。又分为只读和读写两种,此数据段属于静态内存分配;
就是用于存储已经被明确初始化(初始化为非0值)的静态全局变量,全局变量,静态局部变量.
所有字符串常量" "会存在RO段里面, 全局变量和静态变量在Data段.

3) 未初始化数据段(BSS=Block Started by Symbol)
未初始化读写据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间.BSS 段也属于静态内存分配
就是用于存储未被初始化和初始化为0的静态的局部变量,静态全局变量,全局变量。
凡是在bss段存储的数据,初始化都是为0
(注意:同时有BSS和Data段的原因是因为BSS段里面所有的数据都是0,所以编译的时候,磁盘可以不出现BSS段,可以节省空间,运行加载在内存的时候BSS端才会出现)

4) 堆(heap): 用于存放由程序员手动申请的变量
堆内存只在程序运行时出现,一般由程序员手动分配和释放,一般可以使用malloc()/nalloc() &free() 函数来申请、释放。在操作系统下,如果程序员没释放,一般操作系统可以在程序结束后回收内存

5) 栈(stack):用于存储非静态的局部变量,栈的大小无法更改
存放程序的局部变量(但不包括 static 声明的变量,static 意味着在数据段中存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于栈的最大特点后进先出,所以栈特别方便用来保存/恢复调用现场。栈的变量如果不初始化,变量的值是一个随机数.
(注意内核里面的栈只有8k,所以内核里面慎用递归算法,几次循环那么栈就满,会死机)



很多段错误(segment false)发生都是因为对这幅图不理解,所谓的段错误就是修改或者访问无权限的区域, 段错误是逻辑错误,不是语法错误,可以通过编译的

 

#include
#include
int a2 = 0; //bss段
int a3 = 10; //.data
int a1; //bss段static int c1 ; //bss段
static int c2 = 0; //bss
static int c3 = 10; //dataint main(int argc, char const *argv[])
{int b1; //栈int b2 = 0;int b3 = 10;static int d1 ; //bss段static int d2 = 0; //bssstatic int d3 = 10; //data//a1 一定等于0printf("a1 = %p, a1 = %d\n", &a1, a1);printf("a2 = %p\n", &a2);printf("a3 = %p\n", &a3);//b1 随机printf("b1 = %p, b1 = %d\n", &b1, b1);printf("b2 = %p\n", &b2);printf("b3 = %p\n", &b3);printf("c1 = %p, c1 = %d\n", &c1, c1);printf("c2 = %p\n", &c2);printf("c3 = %p\n", &c3);printf("d1 = %p, d1 = %d\n", &d1, d1);printf("d2 = %p\n", &d2);printf("d3 = %p\n", &d3);int *p = (int *)malloc(100);printf("p = %p\n", p);return 0;
}




 


推荐阅读
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 尾部|柜台_Java并发线程池篇附场景分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java并发-线程池篇-附场景分析相关的知识,希望对你有一定的参考价值。作者:汤圆个人博客 ... [详细]
author-avatar
气质沫儿巛1314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有