C 程序的存储空间布局
C 程序有下面几个部分组成:
1 正文段:这是CPU 执行的机器指令的部分。通常正文段是可以共享的,所以即使是频繁执行的程序(如:文本编辑器)在存储器上也只有一个副本。另外正文段常常是只读的,以防止程序因为意外而修改其自身的指令。
2 初始化数据段:通常将此段称为数据段,它包含了程序中需明确赋值的变量。例如:在任何函数之外的声明:int maxcount = 99; 是变量代有初始值存放在初始化数据段中。
3 非初始化数据段:通常将此段称为bss段(block started by symbol)。在程序开始执行之前,内核将此段中的数据初始化为0或者空指针。出现在任何函数外的C 声明: long sum[100]; 使此变量存放在非初始化数据段中。
4 栈:自动变量以及每次函数调用时所保存的信息都存放在此段中。然后,最近调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用C 函数。递归函数每次调用自身时,就是用一个新的栈针,因此一个函数调用实例中的变量不会影响另一个函数调用实例的变量。
5 堆:通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段和栈之间。
当然,程序还有别的类型的段,例如,包含符号表的段、包含调试信息的段以及包含动态共享库链接表的段等等。这些段并不装载到进程执行的程序影像中。
来自:UNIX 环境高级编程 第2版
相关文档:
以 i2c-mpc.c 驱动模块为例
fsl_i2c_init -> of_register_platform_driver -> of_register_driver -> driver_register -> bus_add_driver -> driver_attach
-> bus_for_each_dev -> __driver_attach -> driver_probe_device -> really_probe -> drv->probe(dev); ......
本文仅限于C,主要自己老忘。别的废话少说。
1.Basic
首先考虑函数在函数体内的定义,如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int add(int,int);
int def(int, int);
printf("%d\n", add(1,3));
printf("%d\n", def(3,1));
  ......
#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 ......
//输入参数:*str 搜索字符串
// subStrLen 用于返回找到的最大子字符串长度
//返回:找到的最大子字符串指针
char * findMaxSubStr(char *str, int &subStrLen){
char *subStr;
char *p = str;
int index[256] ;
for (int ix = 0; ix < sizeof(index)/sizeof(index[0]); ix++)
{
in ......