iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言栈、堆和静态存储区怎么使用
  • 521
分享到

C语言栈、堆和静态存储区怎么使用

2023-06-30 04:06:41 521人浏览 薄情痞子
摘要

本文小编为大家详细介绍“C语言栈、堆和静态存储区怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言栈、堆和静态存储区怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、程序中的栈栈是现代计算机程

本文小编为大家详细介绍“C语言栈、堆和静态存储区怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言栈、堆和静态存储区怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、程序中的栈

  • 栈是现代计算机程序里最为重要的概念之一

  • 栈在程序中用于维护函数调用上下文

  • 函数中的参数和局部变量存储在栈上

C语言栈、堆和静态存储区怎么使用

 栈保存了一个函数调用所需的维护信息

  • 参数

  • 返回地址

  • 局部变量

  • 调用上下文

C语言栈、堆和静态存储区怎么使用

二、函数的调用过程

每次函数调用都对应着一个栈上的活动记录

  • 调用函数的活动记录位于栈的中部

  • 被调函数的活动记录位于栈的顶部

C语言栈、堆和静态存储区怎么使用

三、函数调用的栈变化

从main() 开始运行

C语言栈、堆和静态存储区怎么使用

 main() 调用 f()

C语言栈、堆和静态存储区怎么使用

 当从 f() 调用中返回 main()

C语言栈、堆和静态存储区怎么使用

四、函数调用栈上的数据

  • 函数调用时,对应的栈空间在函数返回前是专用的

  • 函数调用结束后,栈空间将被释放,数据不再有效

C语言栈、堆和静态存储区怎么使用

        下面看一个指向栈数据的指针: 

#include <stdio.h> int* g(){    int a[10] = {0};    return a;} void f(){    int i = 0;    int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};    int *pointer = g();        for (i = 0; i < 10; i++)    {        b[i] = pointer[i];    }    for(i = 0; i < 10; i++)    {        printf("%d\n", b[i]);    } } int main(){    f();    return 0;}

         输出结果如下:

C语言栈、堆和静态存储区怎么使用

        如果把 

        for (i = 0; i < 10; i++)

       {

                b[i] = pointer[i];

       }

        注释了,直接打印 pointer[i] 里面的数据,如下:

#include <stdio.h> int* g(){    int a[10] = {0};    return a;} void f(){    int i = 0;    int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};    int *pointer = g();        for(i = 0; i < 10; i++)    {        printf("%d\n", pointer[i]);    } } int main(){    f();    return 0;}

        输出结果如下:

C语言栈、堆和静态存储区怎么使用

         为什么直接打印 pointer[i] 里面的值会是这样呢?因为 pointer 指向的空间是栈空间,栈空间在 g() 函数返回之后,活动记录就被释放了。被释放后调用 printf 函数,printf 函数需要在栈上面建立一个活动记录。这个活动记录就会有 printf 函数的参数信息和返回值等,所以 pointer 所指向的内存里面的数据由于 printf 函数的调用被改变了。因此,不能返回局部变量的地址,不能返回局部数组的数组名。

五、程序中的堆

  • 堆是程序中一块预留的内存空间,可由程序自由使用

  • 堆中被程序申请使用的内存在被主动释放前将一直有效

        为什么有了栈还需要堆?

        答:栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,如:局部数组

C语言程序中通过库函数的调用获得堆空间

  • 头文件:malloc.h

  • malloc -- 以字节的方式动态申请堆空间

  • free -- 将堆空间归还给系统

系统对堆空间的管理方式

空闲链表法,位图法,对象池法等等

C语言栈、堆和静态存储区怎么使用

        以 int* p = (int*)malloc(sizeof(int)); 为例,要申请 4 个字节的大小,遍历之后发现跟 5 Bytes 这个节点最接近,找到一个可以用的单元之后,就将这个单元的地址返还给了 p 指针。以前也提过使用 malloc 申请内存空间时返回的内存空间可能比申请的实际内存空间要大一点点,原因就是在空闲链表管理堆空间这样的系统里面,它会找最近的那个,找到后的一般都大于等于所需要的内存空间,假如 5 Bytes 这个节点下所有的空闲内存单元都用完的话,就会找 12 Bytes 节点下的内存单元,这样malloc 返回的内存空间就有可能比自己实际申请的内存空间要大。

六、程序中的静态存储区

  • 静态存储区随着程序的运行而分配空间

  • 静态存储区的生命周期直到程序运行结束

  • 在程序的编译期静态存储区的大小就已经确定

  • 静态存储区主要用于保存全局变量和静态局部变量

  • 静态存储区的信息最终会保存到可执行程序中

        下面看一个静态存储区的验证代码:

#include <stdio.h> int g_v = 1; static int g_vs  = 2; void f(){    static int g_vl = 3;        printf("%p\n", &g_vl);} int main(){    printf("%p\n", &g_v);        printf("%p\n", &g_vs);        f();        return 0;}

        输出结果如下:

C语言栈、堆和静态存储区怎么使用

         可以看到这三个地址是顺序存放的,因为这三个变量都是存放在程序的静态存储区,静态存储区在程序里面有固定的起始地址。 

读到这里,这篇“C语言栈、堆和静态存储区怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C语言栈、堆和静态存储区怎么使用

本文链接: https://www.lsjlt.com/news/327431.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言栈、堆和静态存储区怎么使用
    本文小编为大家详细介绍“C语言栈、堆和静态存储区怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言栈、堆和静态存储区怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、程序中的栈栈是现代计算机程...
    99+
    2023-06-30
  • C语言深入讲解栈与堆和静态存储区的使用
    目录一、程序中的栈二、函数的调用过程三、函数调用的栈变化四、函数调用栈上的数据五、程序中的堆六、程序中的静态存储区七、小结一、程序中的栈 栈是现代计算机程序里最为重要的概念之一栈在程...
    99+
    2024-04-02
  • go语言的栈与堆怎么使用
    本篇内容主要讲解“go语言的栈与堆怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言的栈与堆怎么使用”吧!栈是一种数据结构,是为执行线程留出的内存空间;栈只允许往线性表的一端放入数据...
    99+
    2023-07-04
  • C语言静态变量static怎么使用
    这篇文章主要讲解了“C语言静态变量static怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言静态变量static怎么使用”吧!关键字static   &nb...
    99+
    2023-07-05
  • Java和C语言如何使用静态语言实现动态数组
    这篇文章将为大家详细讲解有关Java和C语言如何使用静态语言实现动态数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JAVA版JAVA自带了一个集合类ArrayList,可以实现动态数组的功能,相比原生...
    99+
    2023-05-31
    java c语言
  • C语言实现静态存储通讯录的示例代码
    目录最初的构思与规划显示菜单以及main函数增加个人信息显示所有联系人的信息删除个人信息查找个人信息更改个人信息对联系人信息进行排序最后产品展示contart.h 头文件contar...
    99+
    2024-04-02
  • C++ 内存分区模型的使用(代码区、全局区、栈区、堆区、new)
    目录内存分区模型1 代码区2 全局区3 栈区4 堆区5 new运算符参考: 内存分区模型 1 代码区 2 全局区 // 全局变量、静态变量、常量 #include &l...
    99+
    2024-04-02
  • c语言中表示静态存储类别的关键字是
    c语言中表示静态存储类别的关键字是 static。静态存储类别用于指定变量或函数在程序生命周期中保持存在,包括以下特点:全局变量:具有文件作用域,并在程序启动时初始化为 0。局部变量:即...
    99+
    2024-05-02
    c语言 作用域
  • java动态和静态语言的区别是什么
    今天就跟大家聊聊有关java动态和静态语言的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、动态语言在运行中可以改变结构的语言。例如,新函数、对象、代码可以引进,现有函数...
    99+
    2023-06-15
  • c语言静态变量和全局变量有什么区别
    C语言中的静态变量和全局变量在作用域和生命周期上有所区别。1. 作用域:- 全局变量:全局变量定义在函数外部,可以被程序中的所有函数...
    99+
    2023-09-14
    c语言
  • C语言外部链接的静态变量怎么使用
    这篇文章主要介绍“C语言外部链接的静态变量怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言外部链接的静态变量怎么使用”文章能帮助大家解决问题。外部链接的静态变量具有文件作用域、外部链接和...
    99+
    2023-06-27
  • C语言动态内存分配怎么使用
    这篇文章主要介绍了C语言动态内存分配怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态内存分配怎么使用文章都会有所收获,下面我们一起来看看吧。一、动态内存分配的意义C语言中的一切操作都是基于内存的...
    99+
    2023-06-30
  • C语言堆怎么实现和堆排序是什么
    这篇文章主要介绍了C语言堆怎么实现和堆排序是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言堆怎么实现和堆排序是什么文章都会有所收获,下面我们一起来看看吧。一、本章重点堆的介绍堆的接口实现堆排序二、堆2...
    99+
    2023-06-29
  • linux怎么查看堆栈内存使用情况
    要查看Linux系统的堆栈内存使用情况,可以使用以下命令:1. 使用top命令查看系统整体性能,包括内存使用情况。在终端中输入以下命...
    99+
    2023-08-30
    linux
  • 【C语言趣味教程】(7) 存储类:auto 关键字 | register 关键字 | 存储期 | 自动存储期 | 动态存储期 | 线程存储期 | 动态分配存储期 | 静态变量
       🔗 《C语言趣味教程》👈 猛戳订阅!!! Ⅰ. 存储类(Storage Class) 0x00 引入:什么是存储类? ❓ 你没有听说过存储类的概念? 存储类 (Storage Class) 在 C 语言标准中用来 规定变...
    99+
    2023-09-01
    c语言 开发语言 原力计划
  • c语言动态库怎么创建和使用
    要创建一个动态库(也称为共享库),通常需要遵循以下步骤: 编写库的源代码文件,通常是以.c为扩展名的文件,包含库中所需的函数和数...
    99+
    2024-03-02
    c语言
  • C语言怎么实现栈和队列
    本文小编为大家详细介绍“C语言怎么实现栈和队列”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现栈和队列”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是栈栈:一种特殊的线性表,其只允许在固定的一端...
    99+
    2023-06-30
  • C语言中堆排序怎么用
    小编给大家分享一下C语言中堆排序怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、堆排序的概念 堆排序(Heapsort):利用堆积树(堆)这种数据结构所设...
    99+
    2023-06-29
  • C语言中顺序栈和链栈的定义和使用详解
    目录栈的基本内容顺序栈定义入栈操作出栈顺序栈的缺点出栈顺序的计算方法链栈栈的基本内容 无论是我们接下来要讲的栈还是后面要讲到的队列,他们虽然在名字上不同于我们之前的顺序表或者单链表,...
    99+
    2022-11-13
    C语言 顺序栈 链栈 C语言 顺序栈 C语言 链栈
  • 使用C语言怎么对线程对象和线程进行存储
    使用C语言怎么对线程对象和线程进行存储?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作