程序中,在数据声明中定义的变量和数组,它们存储在静态存储区或者动态存储区,其空间由系统负责分配,最终也由系统负责回收,分配时机和回收时机用户无法控制。另外,它们都有自己的名字(因为定义时有命名),程序中可以通过变量名或数组名访问它们。 而“动态分配”的变量或数组,分配时机和释放时机可完全由程序员自己决定。另外,“动态分配”的空间,由于没有数据分明,因此这部分空间没有名字,无法像使用变量或数组那样通过变更名或数组名引用其中的数据,只能通过指针变量来访问。 对于数据在内存中的存储,C语言提供了3种策略,即静态分配、自动分配(栈式分配)和动态分配。 1 静态分配:静态分配由编译器自动分配和释放,在编译时就确定了运行时变量在内存中的位置。这种性质允许变量在整个程序的运行过程中都不消失。在C语言中使用关键字static来定义静态变量(可以是静态局部变量、静态全局变量或者在所有函数外面定义的全局变量)。
2 自动内存分配(在栈上分配):自动分配同样也是由编译器自动分配和释放,在编译时并不确定变量在内存中的位置,而是在调用函数时给变量分配空间,函数返回时释放空间。C编译器通过系统栈来管理这样的变量。在C语言中,auto型变量是通过栈来管理的,不需要人为管理。
3 动态内存分配(在堆上分配):动态分配是指在程序运行过程中动态申请内存的方法。这样的内存空间是从一个叫做堆的空间申请的,申请的空间是一段连续的内存空间。不需要该内存空间时,应该人为释放它,否则会导致内存资源的浪费。
C语言中malloc()大体的实现是,从操作系统一次性地取得比较大的内存,然后将这些内存“零售”给应用程序。
(内存分配中的堆和栈与数据结构的堆和栈有本质的区别。) C语言的变量有两种属性:数据类型和存储类型。存储类型标识符有:auto,extern,static,register。用来说明变量在计算机中不同的存储形态,包括存储位置、作用域和生存期。
函数调用时,主调函数的实参是准备好的具体数值,形参是函数调用时才开辟单元的变量。 在编写程序时,要告诉计算机这些数据的存储位置。变量的存储类型的功能之一就是确定该变量是存放在动态数据区、静态存放区还是寄存器中。
数据存储涉及的内容:
|
|
来自: thchen0103 > 《04.01-04.30》