C中一般有三种变量:
- 局部变量
- 全局变量
- 静态变量
C中一般有五个内存段:
- 代码段
- 也叫文本段,包含frequently executed code
- 通常是只读的(未了避免程序被错误改写)
- 代码段是不包含程序变量(如局部变量、全局变量)的
- 代码段可以包含只读的string字符,如包含代码
printf("Hello World")
时,"Hello World"会被创建在代码段中
数据段:会再被分为未经初始化的和已初始化的数据段。通常位于堆的下面或栈的上面文章来源:https://www.toymoban.com/news/detail-451007.html
- Global variables are stored in the data section. Unlike the stack, the data region does not grow or shrink – storage space for globals persists for the entire run of the program
- 未经初始化的数据段:
- 称为 bss
- bss包含:
- 未初始化的全局变量(包括指针变量)
- 未初始化的局部静态变量
- 若声明了一个全局变量并初始化为0或NULL,仍会存在bss中
- 初始化的数据段:这段的大小由程序源代码中的变量值大小决定,并且在运行过程中不会改变
- 栈段:
- 用于存储函数(可以是main函数或用户定义的函数)内部创建的变量。在函数执行结束后存放在栈中的这些变量会被移除
- 函数的局部变量
- 传递到函数的参数
- 返回地址
- The amount of stack space grows and shrinks over the program’s execution as functions are called and returned from. So the stack part of memory is typically allocated near the bottom of memory to leave space for it to change
- 用于存储函数(可以是main函数或用户定义的函数)内部创建的变量。在函数执行结束后存放在栈中的这些变量会被移除
- 堆段:
- 用于支持动态内存分配(如
malloc
calloc
realloc
) - 例如,当执行
int* prt = malloc(sizeof(int) * 2
时会在堆中分配8字节的内存空间,且这一空间的内存地址会被返回并存储到ptr
变量中。ptr
变量要么在栈中,要么在数据段中(取决于ptr
是怎么被声明的) - The heap is typically located far from stack memory, and grows into higher addresses as more space is dynamically allocated by the running program
- 用于支持动态内存分配(如
文章来源地址https://www.toymoban.com/news/detail-451007.html
一些问题
- 数据段和数据栈、数据堆都是存放变量的,有什么区别:
数据段只包含全局或静态变量,这些变量都有预定义的值,是在程序运行前就初始化好了的
数据堆包含动态分配的数据,并且这一部分的开头一般是数据段的结尾
数据堆、数据栈的 - 堆和栈是什么,有什么区别:
栈:调用函数时,会在栈顶保留一个块用于该函数的局部变量等。当函数返回时,该块变为未使用状态,可在下次调用函数时使用。从堆栈中释放一个块就是调整栈顶指针。
堆:堆不像栈那样,分配和释放都是遵循一个固定模式的(先来后释放),所以对于追踪堆的那个部分在何时被分配或被释放更加复杂。
操作系统为每一个系统级线程分配一个栈,当线程退出时栈也被回收。堆是分配给进程的。
栈更快,因为其先进后出的模式使得当分配或释放空间时,只需要改变栈顶指针即可;而堆就慢了。且栈通常被访问的非常频繁,因此会被map到cache当中,因此会非常快。
堆大部分存的都是全局资源,因此必须要multi-threading safe。具体来说就是每一次分配和释放需要同步
到了这里,关于程序的各种段以及堆栈相关问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!