C语言到底怎么分配空间

Posted ocean2015

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言到底怎么分配空间相关的知识,希望对你有一定的参考价值。

  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语言到底怎么分配空间的主要内容,如果未能解决你的问题,请参考以下文章

c语言中malloc是啥?怎么用?

大家帮我看下这个C语言结构体分配空间的问题好么~

c语言的堆栈是怎么回事!!

怎么用C语言定义一个无限长的数组?

C语言中的 局部变量,存储在啥地方?

c语言 动态数组