C 程序的存储空间布局
C 程序有下面几个部分组成:
1 正文段:这是CPU 执行的机器指令的部分。通常正文段是可以共享的,所以即使是频繁执行的程序(如:文本编辑器)在存储器上也只有一个副本。另外正文段常常是只读的,以防止程序因为意外而修改其自身的指令。
2 初始化数据段:通常将此段称为数据段,它包含了程序中需明确赋值的变量。例如:在任何函数之外的声明:int maxcount = 99; 是变量代有初始值存放在初始化数据段中。
3 非初始化数据段:通常将此段称为bss段(block started by symbol)。在程序开始执行之前,内核将此段中的数据初始化为0或者空指针。出现在任何函数外的C 声明: long sum[100]; 使此变量存放在非初始化数据段中。
4 栈:自动变量以及每次函数调用时所保存的信息都存放在此段中。然后,最近调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用C 函数。递归函数每次调用自身时,就是用一个新的栈针,因此一个函数调用实例中的变量不会影响另一个函数调用实例的变量。
5 堆:通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段和栈之间。
当然,程序还有别的类型的段,例如,包含符号表的段、包含调试信息的段以及包含动态共享库链接表的段等等。这些段并不装载到进程执行的程序影像中。
来自:UNIX 环境高级编程 第2版
相关文档:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define BASE 10
int intlen(long n);
int main()
{
int i, j, num, sz;
i = j = num = sz = 0;
if (!scanf("%d", &num) || num <= 0) {
printf("invalid input\n");
retu ......
数组是类型相同的对象的序列,其中的对象称为数组元素。也可以将数组想像成一连串的用下标值编号的相邻存储区。
可能在某些编程语言中,一个下标变量是不允许超出数组定义中所设的界限的。但是在C和C++中,数组是没有这种安全措施的。下面先来看看数组下标越界的几种异常结果。
&nb ......
C输出格式总结
2007-07-08 12:09
1 一般格式
printf(格式控制,输出表列)
例如:printf("i=%d,ch=%c\n",i,ch);
说明:
(1)“格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两种信息:
&nbs ......
原文:
http://www.codeproject.com/cpp/complex_declarations.asp
作者:Vikram A Punathambekar
介绍
曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明:我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修 ......