zoukankan      html  css  js  c++  java
  • C语言到底怎么分配空间

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

      c语言内存分配与指针讲解
    2. 3

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

      c语言内存分配与指针讲解
    3. 4

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

      c语言内存分配与指针讲解
    4. 5

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

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

      c语言内存分配与指针讲解
    5. 6

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

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

      c语言内存分配与指针讲解
    6. 7

      总结:看下图:

      c语言内存分配与指针讲解
       
       
       
       
       
      免责声明:如有侵权请联系删除
  • 相关阅读:
    SAX解析xml,小实例
    Pull解析xml,小实例
    TCP通信小实例
    android 获取手机信息
    mysql创建用户与授权
    java执行SQL脚本文件
    IOUtils.readFully()的使用
    下载工具类
    vue element ui 父组件控制子组件dialog的显隐
    springboot-mybatis配置多数据源
  • 原文地址:https://www.cnblogs.com/locean/p/5514783.html
Copyright © 2011-2022 走看看