C语言(4)-内存管理 写在前面 堆更容易解释,因为它就是你电脑中的剩余内存,你可以通过访问它来更多内存,OS会使用内部函数为你注册一块内存区域,并且返回指向它的指针。当你使用完这片区域时,你应该使用把它交还给OS,使之能被其它程序复用。如果你不这样做就会导致程序“泄露”内存。 栈是一个特殊的内存区域,它储存了每个函数的创建的临时变量,它们对于该函数为局部变量。它的工作机制是,函数的每个函数都会“压入”栈中,并且可在函数内部使用。它是一个真正的栈数据结构,所以是后进先出的。这对于中所有类似和的局部变量也是相同的。使用栈的优点是,当函数退出时C编译器会从栈中“弹出”所有变量来清理。这非常简单,也防止了栈上变量的内存泄露。 理清内存的最简单的方式是遵守这条原则:如果你的变量并不是从中的,也不是从一个从的函数中的,那么它在栈上。 下面是三个值得的关于栈和堆的主要问题:如果你从了一块内存,并且把指针放在了栈上,那么当函数退出时,指针会被弹出而丢失。如果你在栈上存放了大量数据(比如大结构体和数组),那么会产生“栈溢出”并且程序会中止。这种情况下应该通过放在堆上。如果你了指向栈上变量的指针,并且将它用于传参或从函数返回,接收它的函数会产生“段错误”。因为实际的数据被弹出而消失,指针也会指向被释放的内存。 这就是我在程序中使用来分配内存或退出的原因,相应的用于释放内存。如果你创建了一个“创建”函数,它创建了一些东西,那么一个“销毁”函数可以安全地清理这些东西。这样会更容易理清内存。 最后,当一个程序退出时,OS会为你清理所有的资源,但是有时不会立即执行。一个惯用法(也是本次练习中用到的)是立即终止并且让OS清理错误。 一、内存管理函数 1. 分配内存空间malloc malloc申请内存空间 malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针 使用malloc分配一个int大小的内存空间(分配到堆上) 2. 释放内存空间free free释放ptr参数指向的内存空间 将malloc分配的空间进行释放 3. 申请一段连续的内存空间calloc calloc函数在内存中动态的申请nmemb个长度为size的连续内存空间(即申请的总空间为nmemb * size),这些内存空间全部被初始化为0. calloc要比malloc多出初始化的功能 例如: 4. 重新分配内存空间realloc ptr为原来分配空间的指针,size为新分配的内存空间 例如: 二、C语言的内存布局
内存布局 1. 代码段 代码段(Text segment)通常是用来存放程序执行代码的一块内存区域,这部分区域大小在程序运行前就已经确定,并且内存区域通常属于只读。在代码段中,也有可能包含一些只读的常量变量,例如字符串常量等 2. BSS段 BSS(Bss segment/Uninitialzed data segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。 这个区域段中的数据在程序运行前被自动初始化为数字0 text:是代码段 data:数据段 bss:BSS段 3. 堆 申请方式:程序员手动申请 生存周期:堆的生存周期从动态申请到程序员主动释放为止,不同函数之间均可自由访问 发展方向:堆和其它区段一样,都是从低地址向高地址发展 C语言的栈:通过malloc手动分配,通过free释放
堆定义 4. 栈 申请方式:程序员自动分配 生存周期:栈的生存周期由函数调用开始到函数返回时结束,函数之间的局部变量不能相互访问 发展方向:与堆相反,由高地址向低地址发展 C语言的栈:一般局部变量、函数参数、函数返回值都存在于栈中。
栈定义 5. 堆和栈区别
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/29953.html