C语言总结

编译:接受源代码,转换为中间文件目标代码(扩展名为.o);通过链接形成二进制文件--运行

编译hello文件

gcc -o hello.c

第一部分  基本结构

1)所有C程序包含一个主要的结构,格式:

<返回值类型>main(<可选参数>)

{

<执行语句或函数调用>;

}

对main()使用命令行参数,格式:

<返回值类型>main(int argc,char *argv[])

{}

整型参数argc保存参数个数,argv数组保存输入参数(字符串)

2)函数

<返回值类型>函数名(<参数>){}

函数调用: 函数名(函数签名所需参数)

第二部分  变量类型

int  存储带符号整数值    32位机器上占用4字节,16位机器上占用2字节

float 存储有符号的浮点数    4字节

double 存储比较大的浮点数  8字节

char  存储单个字符  1字节

变量声明

<变量类型><变量名><可选的初始值,以“=”开头>;

int a = 0;

变量赋值

目标=源<可选的运算符>x=x+1

第三部分  格式符号

\n    回车/换行

%d   十进制数

%s  字符串值

%x    十六进制值

strcpy/strncpy

strcpy(<目的串>,<源串>);

当源字符串比目的字符串分配的空间大时,会缓冲区溢出;

strncpy(<目的串>,<源串>,<长度>);

使用长度确保源串可以完整地被复制,限定数目的字符会从源字符串赋值到目的字符串

第四部分  循环

1)for循环

for循环从一个起始值开始,针对某些情况测试该值,执行语句,增加起始值进入下一次循环;

for(<起始值>;<测试值>;<改变值>){<语句>};

2)while循环

while循环是对一系列语句进行迭代,直至某个条件满足为止;

while(<条件测试>){

<语句>;

}

3)if/else

if/else结构满足某些条件情况下执行语句,否则执行else分支里的语句;

if(<条件>){

<如果条件满足,执行语句>} <else>{

<如果条件不满足,执行的语句>;

}

 

杂记:

计算机内存:RAM,任意存储的任意数据块可以在任意时间访问,随机存取;计算机关闭,ram所有数据丢失;

intel的产品x86内存是按32位寻址的,处理器用来选择特定内存地址总线为32位宽,处理器最多能寻址4294967295字节

内存分段: 可将内存划分为小的段,按需分发给进程。寄存器用来存储和跟踪进程当前维护的段;偏移寄存器用来跟踪关键的数据放在段中的位置;

内存中的程序: 进程被载入内存中时,本分裂成许多小的节,

a、.text节

二进制可执行文件的.text部分,包含了完成程序任务的机器指令,该节标记为只读,如果写操作,会发生段错误(segmentation fault),在进程被加载到内存中开始,该节的大小就被固定;

b、.data节

.data节用来存储初始化过的变量;大小运行时是固定的

c、.bss节

栈下节,用来存储未初始化的变量,如int a;大小运行时是固定的

d、堆节

存储动态分配变量,位置从内存低地址向高地址增长。内存分配和释放通过malloc()和free()函数控制

int i = malloc (sizeof (int));//动态分配一个整数指针变量,其值是分配之前该处内存的值;

e、栈节

栈节是跟踪函数调用,可能是递归的,从内存的高地址向低地址增长;导致缓冲区溢出的可能性;先进后出;

f. 环境/参数节

存储系统环境变量的一份复制文件,格式串和缓冲区溢出攻击都可以使用该节,命令行参数也保存在该区域中;

低地址           高地址

.txt .data .bss 堆  未使用 栈  环境

缓冲区

接受和保存数据,直至进程对数据进行处理,通过在进程内存的.data或.bss节分配内存。内存分配之后,缓冲区长度是固定的,缓冲区可以保存任何预定义类型的数据,基于字符串的缓冲区,主要用来保存用户的输入和变量;

内存中的字符串

字符串数据是内存中连续的字符构成的数组,内存中是通过字符串第一个字符的地址来引用一个字符串,结束于空字符('\0');

指针

指针是内存中特定的数据用于保存其他内存区的地址,内存地址是32位长4个字节,指针保存在内存中4个连续的字节里。字符串是通过字符数组中第一个字符的地址进行引用,该地址值被称作一个指针,char * str//提供4个字节保存str,str是一个指向字符变量(字符数组第一个字节)的指针;

INTEL 处理器

8088 8086   16位寄存器;实模式;1MB 内存,按64KB分段;

80286 16位保护模式:16MB内存,按64KB分段;相对8088、8086,增加了新指令;

80386 32位寄存器;32位保护模式;4GB可寻址内存;

80x86 许多版本:486 Pentium xenon 处理速度增强;

itanium:真64位处理器;

所有80x86处理器功能都可以完成复杂算术运算。移动数据,通过解释指令来进行逻辑判断和控制其他设备;

 寄存器

临时存储数据,寄存器是处理器内部8-32位内存块,速度较快;

寄存器类别:

通用寄存器   eax  ebx ecx  edx    用来操作数据

      ax,bx,cx,dx

      ah,bh,ch,dh,al,bl,cl,dl  上一项的8位高字节和低字节

段寄存器  cs,ss,ds,es,fs,gs  16位,保存内存地址的前一部分,保存指向代码、栈和额外数据段的指针

偏移寄存器  指示相对于段寄存器的偏移

      ebp 扩展基址指针  指向函数局部环境的起始处

      esi 扩展源索引    在使用内存块的操作中,保存数据源的偏移

      edi 扩展目标索引  在使用内存块的操作中保存目标数据的偏移量

      esp扩展栈指针   指向栈顶的指针

专用寄存器            只用于CPU内部

      eflags 寄存器,需要了解的关键标志,zf,零标志zero flag,if,中断标志,sf,符号标志 eip扩展指令指针//cpu 用来跟踪逻辑结果和处理器状态

 

寄存器类别:

1)算术逻辑部件ALU

2)程序计数器:存储下一条需要处理的指令的地址,也叫扩展指令指针EIP

3)控制单元是CPU运行的中心

取指/解码单元:一组锁存器、时钟和总线,可以有效的获取下一条需要处理的指令,对程序计数器+1,解码需要执行的指令

I/O控制单元:与外部I/O设备交互。

4)总线

处理器与周边外部设备之间信息交换;处理器内部总线宽度16-64位之间,总线越宽,对处理器速度限制就越小

>>地址总线:选择内存地址,以便读取和写入

>>数据总线:在处理器和内存之间移动数据

>>控制总线:控制外部设备和执行指令

 

posted @ 2014-11-28 14:17  echo1006  阅读(444)  评论(0编辑  收藏  举报