八股文——C 语言宏、`volatile`、`static`、动态内存管理、堆与栈的区别

news2025/3/17 20:44:52

文章目录

    • 1. `#`(字符串化操作符)
      • 作用:
      • 示例:
    • 2. `##`(符号连接操作符)
      • 作用:
      • 示例1:动态生成变量名
    • 3. `volatile` 关键字
      • 作用:
      • 示例:
    • 4. `static` 关键字
      • 作用:
      • 示例:
    • 5. `new/delete` 与 `malloc/free` 的区别
    • 6. 内存分配方式
    • 7. 堆与栈的区别

1. #(字符串化操作符)

作用:

# 用于将宏定义中的传入参数名转换成用一对双引号括起来的字符串。

示例:

#define example1(instr) #instr
string str = example1(abc);

展开后:

string str = "abc";

2. ##(符号连接操作符)

作用:

## 是一个特殊的连接操作符,称为“令牌粘贴运算符”(Token Pasting Operator)。它的作用是将两个预处理令牌(token)连接成一个单独的标识符。

示例1:动态生成变量名

#define DECLARE_VAR(type, name) type name##Var

int main() {
    DECLARE_VAR(int, My); // 展开为:int MyVar;
    MyVar = 10;
    printf("%d\n", MyVar); // 输出:10
    return 0;
}

宏定义解析:

  • DECLARE_VAR(type, name) 宏将 typename##Var 连接起来。
  • name##Var 形成新变量 MyVar

3. volatile 关键字

volatile 提醒编译器,变量的值可能随时变化,因此每次访问时都必须直接从内存读取,而不能使用缓存寄存器的值。

作用:

  • 防止编译器优化,使变量始终从内存读取。
  • 适用于多线程、硬件寄存器等需要实时访问的变量。

示例:

volatile int flag = 0;
while (flag == 0) {
    // 等待 flag 变为非 0
}

4. static 关键字

static 关键字在 C 语言中有多种用途:

作用:

  1. 函数内部:
    • 变量只会被初始化一次,后续调用时保持其值不变。
  2. 文件内部:
    • 变量仅在当前文件内可见,不可被外部文件访问。
  3. 函数声明:
    • 只允许在本文件内部调用,不能被其他文件调用。

示例:

static int count = 0; // 仅在当前文件可用
static void myFunction() { // 仅在当前文件可用
    static int num = 10; // 只初始化一次
    num++;
    printf("%d\n", num);
}

5. new/deletemalloc/free 的区别

区别点new/deletemalloc/free
类型C++ 操作符C 标准库函数
构造/析构new 调用构造函数,delete 调用析构函数仅分配/释放内存,不调用构造/析构函数
返回值返回指定类型指针返回 void* 需转换
内存大小计算自动计算对象大小需手动指定大小
适用范围C++ 对象管理C 语言动态内存管理

6. 内存分配方式

类型分配时间释放时间存储位置生命周期适用场景
静态存储区编译时程序结束静态存储区全局全局变量、静态变量
栈上分配函数调用函数返回函数执行期间局部变量
堆上分配运行时手动释放直到手动释放动态数据结构

7. 堆与栈的区别

区别点堆(Heap)栈(Stack)
申请方式malloc/free由系统自动管理
申请大小受虚拟内存限制,较大一般 1-2MB(固定)
申请效率慢,可能产生碎片快,由系统管理
存储位置堆区栈区
生命周期需手动管理自动管理
适用场景适合存储大对象适合小对象和局部变量

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

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

相关文章

C++初阶——类和对象(三) 构造函数、析构函数

C初阶——类和对象(三) 上期内容,我们围绕类对象模型的大小计算,成员存储方式,this指针,以及C实现栈和C语言的比较,进一步认识了C的封装特性。本期内容,我们开始介绍类的默认成员函…

【Function】使用托管身份调用Function App触发器,以增强安全性

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 1. 背景介绍2. 设置3. 使用Web应用调用Function App触发器(Node.js示例)4. 执行结果此方法允许您使用托管身份(Managed Identity)调…

x012-MSP430F249智能步进电动百叶窗_proteus_光敏电阻_步进电机_仿真

https://www.dong-blog.fun/post/1997 46 、智能步进电动百叶窗 基本要求: 用一台步进电机控制百叶窗叶片的旋转(正转/反转) 用 LED 数码管显示旋转角度 设置按键: 手动/自动切换、手动正转和手动反转,停止/启动键 用一…

牛客周赛85 题解 Java ABCDEFG

A小紫的均势博弈 判断输入的 n 是奇数还是偶数 import java.io.*; import java.math.*; import java.util.*;public class Main {static IoScanner sc new IoScanner();static final int mod(int) (1e97);static void solve() throws IOException {int nsc.nextInt();if(n%2…

# RAG 框架 # 一文入门 全链路RAG系统构建与优化 —— 架构、策略与实践

本文全面阐述了RAG系统从数据收集、数据清洗(包括领域专有名词处理)、智能数据分块与QA对生成,到向量化、向量数据库选择与配置,再到检索方式及重排序,直至整合输出、监控反馈和安全保障的全流程。通过这一完整方案&am…

【Golang】第二弹-----变量、基本数据类型、标识符

笔上得来终觉浅,绝知此事要躬行 🔥 个人主页:星云爱编程 🔥 所属专栏:Golang 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 一、变量 1.1基本介绍…

linux系统CentOS 7版本搭建NFS共享存储

一、什么是NFS共享存储方式 NFS共享存储方式 是一种分布式文件系统协议,允许客户端通过网络访问远程服务器上的文件,就像访问本地文件一样。 二、 NFS的基本概念 (1)服务器端:提供共享存储的机器,负责导…

Matlab 基于SVPWM的VF三电平逆变器异步电机速度控制

1、内容简介 略 Matlab 167-基于SVPWM的VF三电平逆变器异步电机速度控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

(一)微服务初见之 Spring Cloud 介绍

微服务架构简介 从单体应用架构发展到SOA架构,再到微服务架构,应用架构经历了多年的不断演进。微服务架构不是凭空产生的,而是技术发展的必然结果,分布式云平台的应用环境使得微服务代替单体应用成为互联网大型系统的架构选择。目…

架构思维:软件建模与架构设计的关键要点

文章目录 1. 软件建模的核心概念2. 七种常用UML图及其应用场景类图时序图组件图部署图用例图状态图活动图 3. 软件设计文档的三阶段结构4. 架构设计的关键实践1. 用例图:核心功能模块2. 部署图:架构演进阶段3. 技术挑战与解决方案4. 关键架构图示例5. 架…

【RNN神经网络】序列模型与RNN神经网络

前言 清库存。正式切入大模型后,打算把基础知识都梳理一遍,然后写了两篇就发现写不动了,后面就捡重要的记录。RNN知识仅此一篇记录,扫盲记录。 【自然语言处理】 (Natural Language Processing,NLP&#xf…

Python文件管理

目录 一、文本文件读写 1、相关函数 2、读写文件 3、使用readline读取一行 4、读写文件的异常处理 5、添加内容 二、文本文件的编码 1、常见的编码 2、Python程序的编码 3、指定编码 三、文件的路径 1、相对路径 2、绝对路径 3、路径的改变 四、文件夹操作 五、…

vue3 前端路由权限控制与字典数据缓存实践(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 从实战中出发: 1. 基本知识 Vue3 和 Java 通信时如何进行字典数据管理 需要了解字典数据的结构。通常&#x…

基于javaweb的SpringBoot精美物流管理系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

DeepSeek进阶应用(二):结合Kimi制作PPT(双AI协作教程)

🌟引言: DeepSeek作为国产AI大模型,以强大的逻辑推理和结构化内容生成能力著称,擅长根据用户需求生成PPT大纲或Markdown文本;Kimi的PPT助手则能解析结构化内容并套用模板快速生成美观的PPT,两者结合实现“内…

SpringBoot——Maven篇

Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的工具。它具有许多特性,其中一些重要的特性包括: 1. 自动配置:Spring Boot 提供了自动配置的机制,可以根据应用程序的依赖和环境自动配置应用程序的各种组件&#xff…

卷积神经网络(知识点)

一、为了使特征图变小: 由两种方法:1.增大步长:卷积的时候不是一次一步,而是一次多步,类似一张图片,在原来的像素基础上,每隔一个取一个像素点。 其中S就是步长 注意:扩大步长不经…

Vision Transformer (ViT):将Transformer带入计算机视觉的革命性尝试(代码实现)

Vision Transformer (ViT):将Transformer带入计算机视觉的革命性尝试 作为一名深度学习研究者,如果你对自然语言处理(NLP)领域的Transformer架构了如指掌,那么你一定不会对它在序列建模中的强大能力感到陌生。然而&am…

特殊 IP 地址

文章目录 特殊IP地址概述受限广播地址(Limited Broadcast Address)直接广播地址(Directed Broadcast Address)多播地址(Multicast Address)环回地址(Loopback Address)本网络本主机&…

数学——A. K-divisible Sum + D. Exam in MAC

A. K-divisible Sum 题目: 思路: 以下 “[xxx]” 符号均代表向上取整 我们假设总和是sum,那么就有sum k * cnt 要想最大值最小,肯定是要让sum尽可能小,这样每个元素都能变小 最小情况是 sum 恰好等于 n 时&#…