1. 复习RAM/缓冲区溢出攻击法
text 部分存储编译后的二进制文件,如源代码。initialized data 和 uninitialized data 分别存储初始化和未初始化的全局变量; heap 负责动态内存分配的内存(如 malloc()函数) 自上而下增长; stack负责存储函数调用,包括局部变量,函数形参,函数返回地址以便函数调用结束后还能回到原来调用它的函数继续运行,这个由编译器负责。stack自下而上增长。
缓冲区溢出
假设一个函数中有一个数组,int a[10], 显然它是局部变量,存在stack中,倘若给他赋值的时候,没有进行边界检查,则有可能这部分内存太大溢出a[10]的内存,覆盖这个函数的返回地址,导致函数运行结束后无法返回到调用位置。这样程序就崩溃了,这就是缓冲区溢出攻击法。
为了避免缓冲区溢出导致的程序崩溃,在给数组等赋值的时候,一定要进行边界检查,if 条件,或者 assert()
缓冲区溢出(buffer overflow)的定义:
一种严重的程序故障,主要原因是试图通过一个越界的索引访问容器内容,容器类型包括 string, vector, 数组等。
--《C++ Primer 第5版》p117
2. free() 与 malloc() , realloc()
stack 在函数调用结束后就自动释放, heap的内存则是程序员控制的。
用malloc函数动态分配的内存,存在heap 堆中,如果不手动释放这部分内存,这部分内存就可能一直占用,导致内存泄漏(memory leak)
释放方法:free(pointer); 意义是释放pointer存储的地址指向的那部分内存。
https://blog.csdn.net/shizhonghuo19870328/article/details/52945290
3. 结构体
typedef struct
{
int id;
char *name;
char *house;
}
student;
结构体在内存中的存储:
以上面的结构体为例,id 是整型,32bit; name, house是指针,一般来说指针32位或者64位,取决于平台,与它指向什么类型无关。
若 student s;
则s可能就是一块12字节的内存。
若 student class[10];
则class 是一个数组,每个元素是一个student 类型的结构体,每个元素在内存中连续分布,大小为12字节。
关于 typedef struct 和 struct 在C与C++中的区别:https://www.cnblogs.com/qyaizs/articles/2039101.html