内存静态、动态分配的区别:
1、时间不同:静编译 连接 阶段;动 调入 执行阶段
2、空间不同:堆是动态分配的,栈2中分配方式:静动,静是编译器完成:局部变量的分配,动由malloc函数分配,栈的动态与堆 异,他的动态分配由编译器进行释放、无需手工实现
栈内存分配
一个进程的内存空间:逻辑上:代码区、静态数据区、动态数据区
动态数据区:堆栈,栈stack和堆heap不同的动态数据区,栈线性结构、堆链式结构
进程的每个线程都有私有的栈,so线程虽代码同but本地变量的data互不干扰(英语用滴是不是很6)
一个堆栈可通过“基地址”和“栈顶”地址来描述,全局变量、静态变量分配在静态数据区,本地变量配于动态数据区:堆栈中,程序同堆栈基地址、偏移量来访问本地变量
动态内存分配:程序执行过程中动态分派或回收存储空间的分配内存,系统根据程序需要即时分配,要多少分多少(让代码提前进入共产主义社会),用到malloc函数C C++
malloc原型:void* malloc(unsigned int size)在内存的动态存储区分配长度为size的连续空间
参数是无符号整形数,返回值void*(未确定类型的指针可以指向任何类型的数据)指向所分配的连续存储域的起始地址的指针;当函数未成功分配存储空间(内存不足)便会返回一个null指针,所以在调用该函数时应检测返回值是否为null并执行相应的操作
由此函数分配的内存是从堆上分配内存,一定要用free自己释放(从堆上分配的内存),否则内存泄漏或漏洞;free和malloc这两兄弟尽量在同一层上使用,malloc分配的内存要初始化,free后的指针一定要设为null
静态内存:程序开始运行便会分配内存,直到程序结束,内存才被释放
动态内存:程序调用在程序中定义的函数时才被分配,函数调用结束、动态内存就释放
系统释放:系统在自己的表里把这段内存标记为可以使用以后可以被别的程序使用