堆和栈的内存分配
堆
- 是电脑中的剩余内存
- 可以通过
malloc
访问它来获取更多的内存- 此时,OS会使用内部函数注册一块内存区域,并且返回指向它的指针
- 当使用完这一片区域的时候,需要使用
free
将其交还给OS,使之能被其他程序复用- 如果不使用
free
释放内存,则会导致内存泄漏
- 如果不使用
栈
- 栈存储了每个函数创建的临时变量,为局部变量,
- 函数的每个函数都会压入栈中,并且可以在函数的内部使用
- 栈的优点:当函数退出的时候,C编译器会从栈中弹出所有的变量来清理,防止了栈上的内存泄漏
清理内存
-
原则:如果你的变量并不是从
malloc
中获取的,也不是从一个从malloc
获取的函数中获取的,那么他在栈上。 -
关于栈和堆的主要问题:
- 如果从
malloc
获取了一块内存,并且把指针放在了栈上,那么当函数退出的时候,指针会被弹出而丢失 - 如果在栈上存放了大量的数据,则会产生栈溢出并且终止程序
- 这种情况应该使用
malloc
,存放在堆中
- 这种情况应该使用
- 如果获取了指向栈上变量的指针,并且将其用于传参或从函数返回,接收它的函数会产生段错误
- 因为实际的数据被弹出而消失,指针也会指向被释放的内存
- 如果从