第19章 生存期、作用域与可见域
有时兴致勃勃地写完一大篇的程序,编译连接后却显示了很多奇奇怪怪的错误信息,比如某某变量未定义、某某函数找不到等。你可能在嘀咕,这个函数明明在这里啊?那不是某某变量吗?是不是编译器有问题啊?读完本章你就会发现,编译器没有问题,是函数、变量的作用域、生存期与可见域在作怪。
生存期、作用域与可见域可能涉及的程序要素有:变量(普通类型的变量、结构体变量和共用体变量的统称)、常量、函数以及结构体、共用体的定义等。
本章包含的知识点有:
·程序的内存分配问题
·auto、register、extern、static变量
·函数的作用域和可见域
·结构体的作用域和可见域
19.1 内存分配
变量名、函数名等都对应着内存中的一块区域,那么这些实体在内存中是如何存放的呢?程序又是如何使用这些变量的?下面首先从C程序内存分配入手,一步步来回答这些问题。
19.1.1 内存分区
一个由C编译的程序占用的内存大致分为以下几部分。
·栈区(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值等。
·堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。
·全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在同一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放。
·常