基础知识
1.ansi c的历史:c89->c99->c11->c17->c23
2.原码、反码、补码
cpu中有加法器,所有的减法都是通过加法来完成。计算机中的数字都是通过补码表示的。
正数的补码与原码相同:3 =00000011
负数的补码为反码+1 :-5=11111011
3+(-5) =11111110 正好是-2
3.声明与定义区别
定义:为对象分配内存
声明:引用其它位置定义的对象
点击查看代码
other.h:
int i=100; //变量定义,改成 static int i=100结果不变;
main.c:
#include <stdio.h>
#include "other.h"
extern int i;
int main(){
printf("%d",i); //100
}
4.1 pe文件结构
windows下的.exe,.dll,.sys都是pe文件。其它工具:HexEdit,PETool
简单描述:
PE 文件格式把可执行文件分成若干个数据节(section),不同的资源被存放在不同的节中。
一个典型的 PE 文件中包含的节如下。
.text 代码段,由编译器产生,存放着二进制的机器代码,也是我们反汇编和调试的对象。
.data 数据段,初始化的数据块,如宏定义、全局变量、静态变量等。
.idata 导入函数的代码段,存放外部函数地址(所使用的动态链接库等外来函数与文件的信息)。
.rdata 存放程序的资源,如图标、菜单等。
.reloc pe文件加载使用了PE重定位技术。PE加载到进程虚拟地址时,会加载到PE中的IMAGE_OPTIONAL_HEADER结构体中ImageBase(DWORD)字段所指示的位置,一般.exe文件为4000000H,而.dll 文件为1000000H
4.2 pe文件的加载
32位系统下,操作系统通过pe加载器将 exe文件加载至系统低位2G虚拟地址空间。
- 变量对应的存储区
点击查看代码
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int i = 10; //全局初始化区
static int j1 = 20;//全局静态初始化区
char *p;//全局未初始化区
int main(void) {
int x = 10; //栈
char s1[] = "hello";//栈
char *s2 = "hello";//s2在栈,"hello"在常量区
static int j2 = 20;//全局静态初始化区
p = (char *) malloc(20); //在堆上分配 20个字节空间,如果分配的空间无法容纳内容,下面代码可能会出错
strcpy(p, "hello world");
printf("%s", p);
free(p);//释放堆上的空间,还可以再为p分配堆上的空间
return 0;//可以不写,编译器自动加上。
}
小结一下:函数外的或static修饰的都在全局数据区。函数内变量在栈上,动态分配的在栈上。