C语言的结构体和联合(union)可以把一些不同类型的字段封装成一个整体,使用语法也基本相同。区别在于union是所有字段共享一块内存空间,对不同字段的调用是对内存块的值做不同类型的解释。
struct的字段要遵守对齐法则,规则是字段的起始地址必须是字段类型长度的倍数。struct本身的起始地址必须是最大字段类型长度的倍数。
union所有字段起始地址都是union本身的地址,union的长度是最大字段的长度。
对齐指令是.align n。
指针的值表示地址,0表示空。
对指针做强制类型转换,指针的值不变。
函数指针的值是函数第一条指令的地址。
c语言没有防止溢出的保障,栈结构容易遭到破坏。针对这一点,有栈随机化(为栈帧添加随机长度的空白区域),金丝雀值(随机生成一些值用来检测栈是否被破坏)等方法。