当前位置: 首页 > news >正文

嵌入式面试八股文(七)·#ifndef#define#endif的作用、以及内存分区(全局区、堆区、栈区、代码区)

目录

1.  头文件中的#ifndef / #define / #endif的作用是什么?

2.  内存分区:全局区、堆区、栈区、代码区简单描述?

2.1  代码区(Text Segment):

2.2  全局区(Data Segment):

2.3  堆区(Heap):

2.4  栈区(Stack):

3.  C语言各数据类型的取值范围?


1.  头文件中的#ifndef / #define / #endif的作用是什么?

#ifndef:用于判断指定的标识符是否已经被定义。如果该标识符未定义,则执行下面的代码块,否则跳过。

#ifndef MACRO_NAME// 如果没有定义 MACRO_NAME,则编译以下内容
#endif

#define:用于定义指定的标识符,通常用于定义宏。在条件编译中,一般用来定义一个标识符,以便在后面的代码中进行条件判断,通常用于定义一个标识符,用来标记某些代码块已经被处理过。通过定义宏来确保头文件只被包含一次。

#define MACRO_NAME

#endif:用于结束条件编译的代码块。

        三者常用写法:

#ifndef MY_HEADER_H  // 如果没有定义 MY_HEADER_H
#define MY_HEADER_H  // 定义 MY_HEADER_H,表示头文件已经包含// 头文件内容,如结构体、函数声明等#endif  // 结束条件编译块

工作原理:

第一次包含:

  •         当编译器处理一个头文件时,它遇到 #ifndef MY_HEADER_H。
  •         如果 MY_HEADER_H 没有被定义,则会进入条件编译块,并定义 MY_HEADER_H(通过 #define MY_HEADER_H)。
  •         然后,编译器继续编译头文件的内容。

第二次及之后的包含:

  •         如果该头文件在其他地方被再次包含,编译器会再次遇到 #ifndef MY_HEADER_H。
  •         由于宏 MY_HEADER_H 已经被定义,条件 #ifndef MY_HEADER_H 会失败,编译器跳过头文件的内容,不会重复定义和包含相同的内容。

2.  内存分区:全局区、堆区、栈区、代码区简单描述?

2.1  代码区(Text Segment)

作用:存放程序的机器指令,也就是程序的执行代码。

特点:是只读的,防止程序在运行时修改自己的指令。

           通常由操作系统在程序加载时分配,加载到内存中。

           大小固定,一般在程序编译时就确定。

2.2  全局区(Data Segment)

作用:存放程序中的全局变量、静态变量和常量。

特点已初始化的全局变量:如在程序中显式赋初值的全局变量,会存放在该区域。

           未初始化的全局变量:存放在一个叫做BSS(Block Started by Symbol)区的区域,程序启动时会自动初始化为零。

           全局变量在整个程序的生命周期内存在,直到程序结束。

           全局区在程序运行期间不会被改变大小。

2.3  堆区(Heap)

作用:用于动态分配内存。程序运行时可以向堆区申请内存空间(例如,通过 malloc、new 等动态内存分配函数)。

特点:内存的分配和释放由程序员管理(或者通过垃圾回收机制,如在某些高级语言中)。

           堆区内存大小可以动态变化,根据程序的需要增加或减少。

           如果没有及时释放堆区内存,可能导致内存泄漏

           堆区通常位于全局区和栈区之间。

2.4  栈区(Stack)

作用:存放局部变量、函数参数和函数调用时的返回地址等。

特点自动管理:栈的内存分配和释放由操作系统自动完成。函数调用时会自动分配栈空间,函数执行完后会自动释放。

           栈内存的分配遵循“后进先出”的原则(LIFO),即最后被压入栈的变量最先被弹出。

           栈区的大小通常有限,过多的函数调用可能会导致栈溢出

           栈区的内存是临时的,函数返回后,栈中的局部变量会被销毁。

简单来说:

  • 代码区:存储程序的代码,通常是只读的。
  • 全局区:存储全局变量和静态变量。
  • 堆区:用于动态分配内存,由程序员手动管理。
  • 栈区:存储局部变量和函数调用的相关信息,由操作系统自动管理。

3.  C语言各数据类型的取值范围?

关键字位数表示范围stdint关键字ST关键字
char8-128 ~ 127int8_ts8
unsigned char80 ~ 255uint8_tu8
short16-32768 ~ 32767int16_ts16
unsigned short160 ~ 65535uint16_tu16
int32-2147483648 ~ 2147483647int32_ts32
unsigned int320 ~ 4294967295uint32_tu32
long32-2147483648 ~ 2147483647
unsigned long320 ~ 4294967295
long long64-(2^64)/2 ~ (2^64)/2-1int64_t
unsigned long long640 ~ (2^64)-1uint64_t
float32-3.4e38 ~ 3.4e38
double64-1.7e308 ~ 1.7e308

千题千解·嵌入式工程师八股文详解_时光の尘的博客-CSDN博客

相关文章:

嵌入式面试八股文(七)·#ifndef#define#endif的作用、以及内存分区(全局区、堆区、栈区、代码区)

目录 1. 头文件中的#ifndef / #define / #endif的作用是什么? 2. 内存分区:全局区、堆区、栈区、代码区简单描述? 2.1 代码区(Text Segment): 2.2 全局区(Data Segment)&…...

【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练

2024-ESWA-Diffusion-based normality pre-training for weakly supervised video anomaly detection 基于扩散的弱监督视频异常检测常态预训练摘要1. 引言2. 相关工作3. 方法论3.1. 使用扩散自动编码器进行常态学习3.2. 全局-局部特征编码器3.2.1 局部块3.2.2 全局块3.2.3 协同…...

Android 13 实现屏幕熄屏一段时候后关闭 Wi-Fi 和清空多任务列表

明白了,您这个补丁的功能是当设备屏幕关闭一段时间后,自动关闭 Wi-Fi 连接并清空多任务菜单。以下是更新后的博客内容,包含了对功能的详细解释和代码实现: 修改 PowerManagerService.java 以实现屏幕灭屏后关闭 Wi-Fi 和清空多任务菜单功能 在本篇博客中,我们将介绍一个针…...

Elasticsearch磁盘占用大于95%时将所有索引置为只读

在一个稳定运行的功能中,突然收到报错。经查明,是在向 Elasticsearch 中插入文档时出现了错误: AuthorizationException: AuthorizationException(403, ucluster_block_exception, ublocked by: [FORBIDDEN/12/index read-only / allow delete (api)];) 网上也有其他人报出类…...

删除 git config 保存的密码

要从 Git 中删除保存的密码,你可以根据你之前使用的保存方法来操作。以下是一些常见的方法来删除 Git 中保存的密码: 删除 credential.helper 中的密码 如果你之前使用 store 或 cache 作为 credential.helper,你可以执行以下步骤来删除保存…...

Springboot环境搭建详解

springboot学习视频记录: 笔记: a:Springboot maven常见依赖、配置文件笔记-CSDN博客 b:Springboot环境搭建详解-CSDN博客 day01 6:springboot的parent和starter依赖- a 7:启动类的位置配置- b 8&am…...

SpringCloud框架学习(第三部分:Resilience4j 与 Micrometer)

目录 九、CircuitBreaker断路器 1.前言(Hystrix) 2.服务雪崩 3.Circuit Breaker 4. Resilience4j 5.案例实战 (1)熔断(服务熔断 服务降级) Ⅰ. 按照 COUNT_BASED(计数的滑动窗口&#xf…...

Scala的Map集合(不可变)

package gxy//类型:不可变,可变 //操作:添加元素,删除元素,查询元素,移除元素,遍历 object map {def main(args: Array[String]): Unit {//不可变mapval map1 Map("鄂" -> "…...

深入剖析:Spring MVC与Struts的较量

标题:深入剖析:Spring MVC与Struts的较量 引言 在Java Web开发领域,Spring MVC和Struts是两个非常流行的框架。它们各自拥有不同的特点,适用于不同的应用场景。本文将深入探讨Spring MVC和Struts的区别,从底层机制、…...

4.Mybatis中,在Mapper的SQL映射文件中,使用<choose><when>无法识别参数的情况

正确结果 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.itheima.mapper.Bra…...

antd proFromSelect 懒加载+模糊查询

antd proFromSelect 懒加载模糊查询 场景 查询用户的时候数量特别大&#xff0c;有10w条数据&#xff0c;不可能直接全部查询用来展示 所以本文章将讲解如何使用懒加载模糊查询&#xff0c;解决数量过大的问题 后端代码就不用展示了&#xff0c;很简单的分页查询&#xff0c;主…...

Spring Boot 牛刀小试 org.springframework.boot:spring-boot-maven-plugin:找不到类错误

今天看了下书翻了下Spring Boot的用法&#xff0c;下载idea后&#xff0c; 反复出现org.springframework.boot:spring-boot-maven-plugin:找不到类错误&#xff0c;后来看了下调试窗口&#xff0c;发现是连不上maven的网站443错误&#xff0c;解决思路很简单&#xff0c;把ide连…...

qt中ctrl+鼠标左键无法进入

现象&#xff1a;qt中ctrl鼠标左键无法跳转部分函数&#xff0c;例如能跳到textEdit->toPlainText().&#xff0c;但无法跳转到toUtf8();但编译没有问题 排查1&#xff1a;我发现是交叉编译链的问题&#xff0c;使用linux自带就可以进&#xff0c;用ATK-I.MX6U就部分不能进…...

丹摩征文活动 | 丹摩智算平台:服务器虚拟化的璀璨明珠与实战秘籍

丹摩DAMODEL&#xff5c;让AI开发更简单&#xff01;算力租赁上丹摩&#xff01; 目录 一、引言 二、丹摩智算平台概述 &#xff08;一&#xff09;平台架构 &#xff08;二&#xff09;平台特点 三、服务器虚拟化基础 &#xff08;一&#xff09;虚拟化的概念 &#xf…...

本机ip地址和网络ip地址一样吗

在数字化时代的浪潮中&#xff0c;IP地址作为网络设备身份的象征&#xff0c;扮演着举足轻重的角色。然而&#xff0c;当我们谈论IP地址时&#xff0c;常常会听到“本机IP地址”与“网络IP地址”这两个术语&#xff0c;它们之间是否存在差异&#xff1f;又该如何准确理解并区分…...

websocket身份验证

websocket身份验证 前言 上一集我们就完成了websocket初始化的任务&#xff0c;那么我们完成这个内容之后就应该完成一个任务&#xff0c;当客户端与服务端连接成功之后&#xff0c;客户端应该主动发起一个身份认证的消息。 身份认证proto 我们看一眼proto文件的内容。 我…...

案例解读 | 某三甲医院IT监控体系升级实例

PART 01 项目背景 01客户介绍 案例医院是一家某省省属大型三级甲等综合医院。该医院占地三百余亩&#xff0c;总建筑面积约26万平方米&#xff0c;开放床位1500张&#xff0c;资产总值约15亿元&#xff0c;其规划建设一流&#xff0c;拥有诸多先进配套设施&#xff0c;建设项目…...

Ubuntu20.04 为脚本文件创建桌面快捷方式 ubuntu

Ubuntu20.04 为脚本文件创建桌面快捷方式 在Ubuntu 20.04中&#xff0c;为脚本文件&#xff08;如 .sh 文件&#xff09;创建桌面快捷方式是一种提升用户效率的实用方法&#xff0c;允许用户通过图形用户界面直接执行重要或常用的脚本。以下是一种详细、专业且逻辑清晰的通用方…...

LeetCode297.二叉树的序列化和反序列化

题目要求 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序…...

应用程序部署(IIS的相关使用,sql server的相关使用)

数据服务程序&#xff08;API&#xff09;部署 1、修改配置文件 打开部署包中的web.config配置文件&#xff0c;确认数据库登录名和密码正确 修改ip为电脑IP&#xff08;winR输入cmd&#xff0c;输入ipconfig&#xff0c;IPv4对应的就是本机IP&#xff09; 2、打开IIS&#x…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...