1. 程序分为:代码区、数据区、bss区、堆区、栈区。平时常用区分的是代码区、堆区、栈区。下面加上例子区分一下。

  2. 3

    代码区顾名思义就是存放代码的,里面的内容是不可以修改的。例如你定义了一个变量char *buff = "abcdef";这个char型指针指向了代码区,这个指针里面的数据只可以被读取不可以别修改,因为指针指向了代码区,如果你继续往这个指针里面放东西,会报段错误。例如:buff[1] = 'a',这样会报错,段错误。因为上面已经将buff指向了代码区,代码区的数据是不可以改变的,但是你想要给buff[1]赋值,这时编译的时候不会报错,但是运行的时候会报段错误,这种错误对于初学者来说相当恶心,如果报段错误建议给我使用gdb调试。段错误大部分是因为内存使用错误。

  3. 4

    栈区:系统分配,系统释放(跟堆区最重要的区别)。看图:正确的是因为指针指向了栈区,栈区的数据是可以改变的,所以第一个buff[1] = 'a';是正确的第二个是错误的(第二个指向了代码区)

  4. 5

    堆区:说白了就是由程序员分配一块内存,然后往这块内存中写数据,栈区是系统分配内存然后往里面写数据,栈区是有系统释放,但是堆区的内存必须有程序员释放,不然会造成内存泄露(后果相当严重,会造成死机现象)。

    C++中由new和delete来分配和释放,C中由malloc和free来分配和释放。

  5. 6

    数据区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。

    BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。

  6. 7

    总结:看下图:

     
     
     
     
     
    免责声明:如有侵权请联系删除

C语言到底怎么分配空间的更多相关文章

  1. C语言malloc函数为一维,二维,三维数组分配空间

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  2. C++开发系列-C语言的malloc与C++的new分配空间

    概述 在软件开发过程中,常常需要动态地分配和撤销存储空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符ne ...

  3. JVM知识(一) 求你了,别再说Java对象都是在堆内存上分配空间的了!

    求你了,别再说Java对象都是在堆内存上分配空间的了! https://baijiahao.baidu.com/s?id=1661296872935371634&wfr=spider& ...

  4. C语言中内存分配 (转)

    在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...

  5. 如何让对象只在堆或者栈中分配空间ANDC++禁止一个类被继承

    在开始之前先来分析一下C++中的new运算符和operator new之间的关联. new:指我们在C++里通常用到的运算符,比如A* a = new A或者调用带参数的构造函数;  对于new来说, ...

  6. 【转】C语言中内存分配

    原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...

  7. C 语言内存区域分配(进程的各个段)详解

    C语言可执行代码结构  名称 内容 代码段  可执行代码.字符串常量 数据段  已初始化全局变量.已初始化全局静态变量.局部静态变量.常量数据 BSS段  未初始化全局变量,未初始化全局静态变量 栈 ...

  8. C语言中内存分配

     C语言中内存分配   在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...

  9. C++中class在实例化前到底占用多少空间

    最近忽然想起一个问题,C++中class在实例化前到底占用多少空间?我隐约记得书上是这么说的“类在实例化时才分配空间”!但是当我写下这个小程序的时候,杯具产生了—— #include<iostr ...

随机推荐

  1. wait和waitpid的使用和区别

    昨天看到一则新闻,讲的是一个游戏开发大拿猝死去世的新闻,公司发了讣告,打算接下去给他爸爸妈妈每个月10000的赡养费,很是感慨,本来中国的游戏业和国外就差距大,天妒英才啊.真心想对那些游戏公司的领导说 ...

  2. Nodejs in Visual Studio Code 14.IISNode与IIS7.x

    1.开始 部署IISNode环境请参考:Nodejs in Visual Studio Code 08.IIS 部署Nodejs程序请参考:Nodejs in Visual Studio Code 1 ...

  3. bzoj 1055 [HAOI2008]玩具取名(区间DP)

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1258  Solved: 729[Submit][Statu ...

  4. SRM 504(2-1000pt)

    DIV2 1000pt 题意:对于一个n*m的矩阵,每个格子都有一个颜色B或者W.对矩阵A执行以下程序后变成矩阵B.给出矩阵B,求A.(若有多种情况,输出字典序最小的).(n,m <= 16) ...

  5. 路由器刷机常见第三方固件及管理前端种类(OpenWrt、Tomato、DD-Wrt)

    目前路由器折腾刷机,除了采用各品牌的原厂固件外,第三方路由器固件,基本就是:Tomato.DD-WRT.OpenWRT三种. 基本上所有第三方路由器固件的架构上可分为前端(Frontend)和后端(B ...

  6. 无题II hdu 2236(二分枚举区间)

    分析:只需要用二分找一个区间,然后不断枚举这个区间是否可以达到最大匹配,一直二分到答案为止.   代码: =============================================== ...

  7. ruby 安装 运行

    Ruby基础 一 简介 1.Ruby在windows平台下的安装 (1)下载地址:http://rubyinstaller.org/downloads/ (2)安装过程 这里我们选择安装路径为 D:\ ...

  8. SQL中的case when then else end用法

    --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' ...

  9. python中的TCP编程学习

    今天看了一下关于python的TCP编程. 发现思路和其他语言(比如java)思路基本上差点儿相同. 先看client.基本过程例如以下: 第一步:创建一个socket 第二步:建立连接 第三步:发送 ...

  10. WWDC心愿单:新版OS X或将有这些变化

    每年的WWDC开发者大会上苹果都会展示最新的软件研发成果,在新一代MacBook Pro和MacBook Air笔记本到来之前,我们不妨来期待下新版OS X会有怎样的变化. Siri入驻Mac   此 ...