struct s{
char a;
int b;
}
以上代码涉及到字节对齐问题,编译器为使cpu执行效率高,采取以空间换时间的方法,一次读取int的长度
结构体的变量定义顺序不同,size也不一样
e.g:
struct s1{
char a;
int b;
short e;
}
struct s2{
char a;
short e;
int b;
}
s1和s2的字节数就不一样,s2是8个,因为e是short型,可以占给a分配的多余的3个字节中的2个,
内存从低地址到高低址依次分布代码区、堆区、栈区、内核区,内核区通常我们编写的指针不能访问,低地址的起始部分是受保护区域,也不能访问,一旦访问,就会出现段错误
代码区可分为只读数据段、全局数据段(有初始值,无初始值)
局部变量前加上static,该局部变量就会放入全局数据段,只是局部有效(在大括号里有效),static局部变量不会随着函数的结束而被销毁
栈空间运行时才有,主要保存函数内部变量,函数一旦返回,对应栈的空间就被释放,生存周期比较短
堆空间运行时才有,可以自由管理分配和释放空间,生存周期由程序员决定,不由系统决定
只读数据段又称为静态段,程序结束时才释放内存,生存时间最长
void func(){
unsigned char *p;
p = (unsigned char *)malloc(100*sizeof(unsigned char));
return;
}
以上代码是典型的内存泄漏代码,p指向了一段堆空间,但函数一结束,p被释放了,但开辟的堆空间没有释放,需要free