17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期

17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期

文章目录

  • 17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期
    • 一、自动存储期
      • 示例
    • 二、静态存储期
      • 2.1 示例
    • 三、自定义存储期
      • 3.1 如何申请内存
      • 3.2 如何释放内存
      • 3.3 如何清空内存
      • 3.4 示例

概念
在C语言中,每个变量都有一个生命周期,即从变量的内存申请到释放的过程。申请内存相当于变量的诞生,释放内存则相当于变量的消亡。变量的生命周期有以下三种形式:

  1. 自动存储期
  2. 静态存储期
  3. 自定义存储期
    在这里插入图片描述

一、自动存储期

自动存储期的变量在栈空间中分配,内存由系统统一管理。自动存储期的几个等价概念包括:

  • 自动化变量:从存储期的角度来描述变量的存储特性
  • 临时变量: 从存储期的角度来描述变量的存储特性
  • 局部变量: 从作用域的角度来表述变量的空间特定

示例

int main(int argc, char const *argv[]) // argc 和 argv 属于自动存储期的局部变量
{int a; // 自动存储期 / 局部变量static int b; // 静态存储期的局部变量func(a, b);
}void func(int x, int y) // x 和 y 属于自动存储期的局部变量
{// 函数体
}

二、静态存储期

静态存储期的变量在数据段中分配,内存在程序运行之初就已经分配好,并且不会随着程序的运行发生申请和释放的问题。静态存储期的变量直到整个程序退出才会释放,生命周期与进程一致。

  • 全局变量,static只是影响他的作用域,并不影响他的存储期.
  • static修饰的局部变量,对于局部变量而言static只是改变了变量的存储期,而没有改变他的作用域.

2.1 示例

int a = 100; // 静态存储期
static int b = 250; // 静态存储期,作用域为本文件int main()
{int k; // 自动存储期 / 局部变量static int k = 450; // 静态存储期的局部变量
}

注意:

  • .bss 段存放未初始化的静态变量,初始值为 0
  • .data 段存放已经初始化的静态变量,初始化语句只会被执行一次
  • 静态数据从进程运行之初就已经存在,直到进程退出为止。

三、自定义存储期

自定义存储期的变量在堆内存中分配,内存的申请与释放完全由用户自己控制。

3.1 如何申请内存

  • malloc:只负责申请空间,不会清空内存。
  • calloc:申请内存并默认清空为 0。

3.2 如何释放内存

  • free:负责释放内存,但不会清空内存,也不会让指针指向空,释放后最好将指针设为 NULL

3.3 如何清空内存

  • bzero
  • memset

注意:

  • malloc 只负责申请空间, 并不会清空内存,因此一般使用bzero 清空
  • calloc 负责申请内存,并会默认清空为 0 .
  • free 只负责释放,也不会清空 更不会让指针指向空, 因此free之后最好让指针指向NULL.

3.4 示例

#include <stdlib.h>
#include <string.h>int main()
{int *p = (int *)malloc(10 * sizeof(int)); // 申请内存if (p == NULL) {// 处理内存分配失败的情况return -1;}// 清空内存memset(p, 0, 10 * sizeof(int));// 使用内存...// 释放内存free(p);p = NULL; // 释放后将指针设为 NULL
}

总结

  • 自动存储期:变量在上分配,生命周期由系统管理,函数结束时自动释放。
  • 静态存储期:变量在数据段中分配,生命周期与程序一致,程序结束时释放。
  • 自定义存储期:变量在上分配,生命周期由用户管理,用户需要手动申请和释放内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

salesforce保存记录后,根据条件弹出对话框提示

首先创建一个Visualforce页面并添加到页面布局。 Visualforce页面 条件语句&#xff1a; 在Visualforce页面的条件语句中&#xff0c;您需要使用正确的Visualforce表达式语法来插入JavaScript代码。此外&#xff0c;Visualforce的表达式语法不支持JavaScript直接调用&#xff…

Redis面试题(个人总结)

1、Redis特点 1、Redis是一个高性能且基于内存的数据库&#xff0c;所有的数据形式都是以键值对的方式来存储的 2、Redis支持丰富的数据类型&#xff0c;例如string,list,set,sorted set,hash&#xff0c;这些类型指的是键值对中的值的类型 3、Redis支持持久化 4、Redis单线程…

MQTT通讯协议接入

1.MQTT协议概述 MQTT是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;常用于低带宽、不可靠网络环境下传输消息&#xff0c;适用于物联网设备之间的通信。 1.1 MQTT协议的组件 客户端&#xff08;Client&#xff09;&#xff1a;连接到MQTT代理服务器的设备&#xff…

触摸芯片在物联网和人工智能上的应用

在科技更新换代频繁的时代&#xff0c;触摸芯片作为一种重要的人机交互技术&#xff0c;已经在逐渐融入我们的生活。为我们带来了更加便捷、直观的电子产品操作体验&#xff0c;让人与机器之间的沟通变得更加自然流畅。今天我们就来说一说触摸芯片。 触摸芯片的核心是电容感应…

dijkstra 算法为什么高效?

Dijkstra算法的高效性主要体现在其解决有权图中最短路径问题时所采用的方法和策略上。以下是对Dijkstra算法高效性的详细解释&#xff1a; 贪心策略&#xff1a; Dijkstra算法基于贪心原理&#xff0c;在每一步中总是选择具有最小暂定距离的节点。这种策略保证了算法首先探索一…

计算机组成原理(六)

0x12345678和12345678H都是指同一个十六进制,也就是12345678&#xff0c;不过是不同的编程语言的写法而已 具体来说&#xff0c;如果有 n 根地址线&#xff0c;计算机可以寻址的内存空间大小是 2^n 字节。 24根地址线&#xff1a; 如果一个系统有24根地址线&#xff0c;意味着它…

Codeforces Round 952 (Div. 4)

题解写到博客园了&#xff0c;懒得复制过来了了&#xff0c;放个链接 https://www.cnblogs.com/yxcblogs/p/18243276 推广一下自己记录的算法编程竞赛模板仓库 GitHub - yxc-s/programming-template: This repository contains C programming templates optimized for competi…

汇编程序设计之 位操作指令、顺序程序设计

文章目录 位操作类指令逻辑运算指令NOTORANDXORTEST 移位指令逻辑移位算数移位循环移位指令 处理机控制类指令顺序结构程序设计概念例子 位操作类指令 逻辑运算指令 NOT OR 对于每一个位&#xff0c;有1即为1 AND 同时为1才是1 XOR 不相同才为1 TEST 和and 一样的功能&…

postman接口测试工具详解

Postman是一款非常流行的API开发和测试工具&#xff0c;它不仅适用于测试人员&#xff0c;也广泛被开发者使用。Postman提供了全面的功能&#xff0c;能够帮助用户构建、测试、修改和监控API。以下是关于Postman接口测试工具的一些关键功能和使用步骤的详解&#xff1a; 功能概…

RK3568技术笔记六 新建 Ubuntu Linux 虚拟机

VMware 安装完成后&#xff0c;启动 VMware 软件。启动后在 VMware 主界面点击“创建新的虚拟机”。如下图所示&#xff1a; 开始对新建的虚拟机进行设置。选择“自定义”&#xff0c;然后点击“下一步”。如下图所示&#xff1a; 使用默认配置&#xff0c;单击“下一步”。如下…

PyTorch -- 最常见激活函数的选择

首先&#xff0c;简单复习下什么是梯度&#xff1a;梯度是偏微分的集合 举例说明&#xff1a;对于 z y 2 − x 2 : ∇ z ( ∂ z ∂ x , ∂ z ∂ y ) &#xff08; 2 x , 2 y &#xff09; z y^2-x^2: \nabla z (\frac{\partial z}{\partial x}, \frac{\partial z}{\partia…

夏日炎炎 水域守护:北斗守护安全防线——为生命撑起智能保护伞

随着夏季的来临&#xff0c;炎热的天气让许多人纷纷寻求水的清凉。清凉的河流与广阔的海域成为了不少人消暑降温的向往之地。然而&#xff0c;私自下河、下海的行为却暗藏着巨大的安全隐患&#xff0c;每年夏季溺水事故频发&#xff0c;给无数家庭带来不可挽回的悲痛。为有效遏…

规模弹性: 管理谷歌的TPUv4机器学习超级计算机

摘要 TPUv4&#xff08;张量处理单元&#xff09;是谷歌用于机器学习训练的第三代加速器&#xff0c;采用定制的三维环形互连&#xff0c;部署为 4096 节点的超级计算机。在本文中&#xff0c;我们将介绍设计和运行软件基础设施的经验&#xff0c;这些软件基础设施使 TPUv4 超…

Git进阶使用(图文详解)

文章目录 Git概述Git基础指令Git进阶使用一、Git分支1.主干分支2.其他分支2.1创建分支2.2查看分支1. 查看本地分支2. 查看远程分支3. 查看本地和远程分支4. 显示分支的详细信息5. 查看已合并和未合并的分支 2.3切换分支1. 切换到已有的本地分支2. 创建并切换到新分支3. 切换到远…

【SkiaSharp绘图03】SKPaint详解(一)BlendMode混合模式、ColorFilter颜色滤镜

文章目录 SKPaintSKPaint属性BlendMode获取或设置混合模式SKBlendMode 枚举成员效果预览 Color/ColorF获取或设置前景色ColorFilter 颜色滤镜CreateBlendMode 混合模式CreateColorMatrix 颜色转换CreateCompose 组合滤镜CreateHighContrast 高对比度滤镜CreateLighting 照明滤镜…

flask实战之模板实现公共导航

基础实现 目标 在Flask中&#xff0c;使用模板继承和块&#xff08;blocks&#xff09;可以方便地提取公共导航菜单&#xff0c;使得您可以在多个页面上重用相同的导航结构。以下是一个基本示例&#xff0c;展示如何创建一个包含公共导航菜单的模板&#xff1a; 创建基础模板…

译译交友项目介绍

一、 项目背景 随着社会的进步&#xff0c;英语作为一种国际语言&#xff0c;很多人都在学习英语&#xff0c;然而现在很多人都会因为学习英语而烦恼&#xff0c;有时还会因为是一个人学习而感到枯燥。面对情绪的低落&#xff0c;往往会使学习更困难。因此&#xff0c;我打造了…

游戏心理学Day13

游戏成瘾 成瘾的概念来自于药物依赖&#xff0c;表现为为了感受药物带来的精神效应&#xff0c;或是为了避免由于断药所引起的不适和强迫性&#xff0c;连续定期使用该药的 行为现在成瘾除了药物成瘾外&#xff0c;还包括行为成瘾。成瘾的核心特征是不知道成瘾的概念来自于药…

MySQL系列-语法说明以及基本操作(二)

1、MySQL数据表的约束 1.1、MySQL主键 “主键&#xff08;PRIMARY KEY&#xff09;”的完整称呼是“主键约束”。 MySQL 主键约束是一个列或者列的组合&#xff0c;其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键&#xff0c;通过它可以强制表的实体完整性。 …

编程基础知识读后感怎么写:深入剖析与全面解读

编程基础知识读后感怎么写&#xff1a;深入剖析与全面解读 在阅读完编程基础知识相关书籍或资料后&#xff0c;撰写一篇高质量的读后感是巩固所学、深化理解的重要方式。然而&#xff0c;如何写出一篇既有深度又有广度的读后感&#xff0c;却是一个让许多人感到困惑的问题。本…