一:内存分类(主要分为4个区):
1.代码段(普通函数,静态函数):存放程序,函数文本
2.全局(静态)变量区(除了普通局部变量):也成为数据段,其生命周期长,默认值为0
3.栈(普通局部变量):保存局部变量的地方,函数调用,小巧(约1M),系统管理
4.堆(动态内存):动态内存,很大(1G以上),由程序员自行管理,调用malloc等函数创建,调用free等函数释放
二:变量
全局变量:定义在函数外部的变量,慎用(最好不用,缺点就是不安全)
局部变量:定义在函数内部的变量
静态全局变量:默认值为0 ,保存在全局(静态)变量区,链接属性为内部的
普通全局变量:默认值为0,保存在在全局(静态)变量区,链接属性为外部的,可以让同项目的其他文件使用
静态局部变量:默认值为0,保存在在全局(静态)变量区
普通局部变量:默认值为随机值,保存在在栈中,定义在函数内部的变量
动态内存:默认值为随机值,保存在堆中
三:free崩溃的原因(头的原因或者尾的原因)
每个动态内存都有一个头一个尾,头中保存了动态内存的大小,尾用来合并内存碎片
1.越界(数组越界或者内存创建时少了),尾找不到了,把尾巴踩掉了
# include <stdio.h>
# include <assert.h>
# include <stdlib.h>
int main ( )
{
int n;
scanf ( "%d" , & n) ;
int * arr = ( int * ) malloc ( n* sizeof ( int ) ) ;
assert ( arr != NULL ) ;