面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述
文章目录
- `sizeof` 和 `strlen`
- 数组和链表
- 总结
- #include <>和 #include ""
- #define 和typedef
- 内存对齐概述
- 对齐规则
- 示例:结构体的内存对齐
- 分析:
- 内存对齐的常见规则:
- 填充字节的计算
- 对齐影响的实际例子
sizeof 和 strlen
| 特性 | sizeof | strlen |
|---|---|---|
| 定义 | 运算符,也是关键字,用于获取类型或变量所占的字节数 | 函数,用于计算 C 风格字符串的长度(不包括 '\0') |
| 用途 | 返回对象或数据类型在内存中占用的字节数 | 返回 C 风格字符串的字符数量(不包括 '\0') |
| 计算方式 | 在编译时确定,求值过程是静态的 | 在运行时计算,需遍历字符串逐字符计数 |
| 适用类型 | 适用于所有类型,包括数组、结构体、指针、基本数据类型等 | 仅适用于 C 风格字符串(以 '\0' 结尾的字符数组) |
| 返回值 | 返回的是字节数,通常是 size_t 类型 | 返回字符串中字符的数量,不包括 '\0' 字符 |
| 操作对象 | 数据类型、变量、数组、结构体等 | C 风格字符串(const char* 或 char[]) |
是否包括 '\0' | 包括 '\0'(例如对字符数组使用 sizeof 会计算整个数组大小) | 不包括 '\0'(只计算实际字符数) |
| 适用场景 | 获取类型或数组的内存大小,计算静态数据结构的大小 | 获取字符串的实际长度(不包括结束符 '\0') |
| 示例代码 | sizeof(int) 返回 4(通常情况下) | strlen("Hello") 返回 5 |
| 计算复杂度 | 常数时间复杂度,编译时计算 | 线性时间复杂度,需要遍历整个字符串 |
数组和链表
| 特性 | 数组 | 链表 |
|---|---|---|
| 定义 | 数组是一种线性数据结构,它包含固定大小的连续元素 | 链表是一种线性数据结构,它由节点组成,每个节点包含数据和指向下一个节点的指针 |
| 内存结构 | 在内存中分配一个连续的块 | 每个节点在内存中不一定是连续的,节点通过指针连接 |
| 存储方式 | 静态存储方式(大小固定) | 动态存储方式(可以动态增加或删除节点) |
| 元素类型 | 所有元素类型相同(通常是基本数据类型) | 每个节点可以存储不同类型的数据,节点可以包含不同的结构 |
| 访问方式 | 通过索引直接访问元素,时间复杂度为 O(1) | 通过指针遍历,每次只能访问当前节点,时间复杂度为 O(n) |
| 插入与删除 | 插入或删除元素时需要移动元素,时间复杂度为 O(n) | 插入和删除操作在头部和尾部的时间复杂度为 O(1),在中间位置为 O(n) |
| 内存分配 | 在定义数组时就分配固定大小的内存 | 节点可以在运行时动态分配和释放内存 |
| 大小变动 | 大小固定,无法在运行时调整 | 可以动态增减节点,大小可以灵活变化 |
| 内存浪费 | 如果数组大小过大,可能会浪费内存 | 如果链表很长且有很多空节点,可能会浪费指针的内存 |
| 优缺点 | 优:访问快速;缺:插入和删除操作不灵活 | 优:插入和删除操作灵活;缺:访问速度较慢 |
总结
- 数组 是一种高效的、固定大小的线性数据结构,适合需要快速访问的场景,但它不适合频繁的插入和删除操作。
- 链表 适合需要频繁动态插入和删除的场景,尽管它的访问速度较慢,但它提供了更大的灵活性,尤其在内存使用方面。
#include <>和 #include “”
| 特性 | #include <> | #include "" |
|---|---|---|
| 用途 | 用于包含系统或标准库的头文件 | 用于包含用户定义的头文件或当前目录下的头文件 |
| 查找顺序 | 编译器首先查找标准库路径中的头文件 | 编译器首先查找当前目录中的头文件,若找不到,再查找标准库路径 |
| 适用场景 | 用于包含标准库或第三方库的头文件(如 #include <iostream>) | 用于包含项目中的自定义头文件(如 #include "myheader.h") |
#define 和typedef
#define 和 typedef 都是 C/C++ 中常用的预处理指令和关键字,主要用于定义常量、宏和类型别名。它们有不同的功能和使用方式,下面是详细的比较:
| 特性 | #define | typedef |
|---|---|---|
| 用途 | 用于定义宏(常量、函数、代码片段) | 用于定义类型别名(为现有类型起别名) |
| 作用范围 | 在宏定义之后,它的作用范围是整个文件 | 在定义之后,它的作用范围通常是当前作用域或文件 |
| 类型检查 | 不进行类型检查,纯粹的文本替换 | 进行类型检查,确保新类型的合法性 |
| 宏定义的作用 | 定义常量、简单函数或复杂的代码块 | 不支持宏功能,只有类型别名 |
| 宏展开时机 | 宏在预处理阶段展开(编译前) | typedef 只是定义别名,不会进行宏展开 |
| 调试支持 | 宏没有调试信息(因为宏只是简单的文本替换) | typedef 可以像普通类型一样调试 |
| 示例 | #define PI 3.14 | typedef int Integer; |
内存对齐概述
内存对齐(Memory Alignment)是计算机体系结构中对数据存储方式的一种要求,它规定了数据类型的存储地址必须是某个特定值的倍数。
在现代计算机中,通常要求数据按照一定的对齐方式存储,例如 4 字节对齐、8 字节对齐等。对齐通常会影响结构体和数组的内存布局,从而决定其内存占用的大小。
对齐规则
-
基本对齐规则:
- 每个数据类型的存储地址应当是该数据类型大小的倍数。例如:
char类型通常是 1 字节,通常可以存储在任何地址。int类型通常是 4 字节,存储地址必须是 4 的倍数。double类型通常是 8 字节,存储地址必须是 8 的倍数。
- 每个数据类型的存储地址应当是该数据类型大小的倍数。例如:
-
结构体对齐:
- 对结构体中的成员进行对齐时,结构体的总大小将是最大成员对齐要求的倍数。
- 结构体中每个成员的起始地址需要满足其对齐要求。如果某个成员的起始地址不符合其对齐要求,编译器会在它和下一个成员之间插入填充字节(padding bytes)来保证对齐。
-
结构体总大小:
- 结构体的总大小应该是最大对齐要求的倍数。如果结构体中的成员总和大小不满足最大对齐要求,编译器会在结构体末尾添加填充字节,以使结构体的总大小是对齐要求的倍数。
示例:结构体的内存对齐
考虑以下代码:
#include <stdio.h>typedef struct {char c; // 1 字节int i; // 4 字节double d; // 8 字节
} Example;
分析:
char c占 1 字节。int i占 4 字节。double d占 8 字节。
在 Example 结构体中:
char c需要 1 字节,但是由于int需要 4 字节对齐,编译器会在char c后插入 3 个填充字节,使int i能够正确地以 4 字节对齐。int i占 4 字节,按照 4 字节对齐。double d占 8 字节,按照 8 字节对齐。- 结构体的总大小应是 8 的倍数(由于
double的 8 字节对齐要求)。因此,结构体的总大小会扩展到 24 字节(1 + 3 + 4 + 8 + 8 的填充)。
结果:该结构体的大小是 24 字节,而不是成员大小的总和 13 字节。
内存对齐的常见规则:
| 数据类型 | 对齐方式 | 描述 |
|---|---|---|
char | 1 字节 | char 类型的对齐方式为 1 字节。 |
short | 2 字节 | short 类型的对齐方式为 2 字节。 |
int | 4 字节 | int 类型的对齐方式为 4 字节。 |
float | 4 字节 | float 类型的对齐方式为 4 字节。 |
double | 8 字节 | double 类型的对齐方式为 8 字节。 |
long | 4 字节或8字节 | long 类型的对齐方式依赖于系统架构。 |
long long | 8 字节 | long long 类型的对齐方式为 8 字节。 |
填充字节的计算
考虑以下结构体定义:
typedef struct {char c; // 1 字节int i; // 4 字节
} MyStruct;
-
char c占 1 字节,紧接着是int i,但是int类型要求 4 字节对齐。因此,编译器会在char后插入 3 个填充字节,使int的起始地址是 4 的倍数。 -
所以,
int i占 4 字节,整个结构体的大小需要为 4 字节对齐。因此,结构体的总大小将是 8 字节。
对齐影响的实际例子
#include <stdio.h>typedef struct {char c;int i;double d;
} Example;int main() {printf("Size of Example: %zu\n", sizeof(Example));return 0;
}
假设:
char c占 1 字节。int i占 4 字节(要求 4 字节对齐)。double d占 8 字节(要求 8 字节对齐)。
计算结构体内存:
char c占 1 字节。- 插入 3 字节填充,使
int i能够 4 字节对齐。 int i占 4 字节。double d占 8 字节,且由于对齐要求,double的起始地址必须是 8 的倍数。- 结构体的总大小会被扩展到 16 字节,以满足 8 字节对齐。
输出结果:
Size of Example: 16
以最大类型所占内存分配内存空间。
相关文章:
面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述
文章目录 sizeof 和 strlen数组和链表总结 #include <>和 #include ""#define 和typedef内存对齐概述对齐规则示例:结构体的内存对齐分析: 内存对齐的常见规则:填充字节的计算对齐影响的实际例子 sizeof 和 strlen 特性size…...
低代码系统-产品架构案例介绍、炎黄盈动-易鲸云(十二)
易鲸云作为炎黄盈动新推出的产品,在定位上为低零代码产品。 开发层 表单引擎 表单设计器,包括设计和渲染 流程引擎 流程设计,包括设计和渲染,需要说明的是:采用国际标准BPMN2.0,可以全球通用 视图引擎 视图…...
自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)
开源地址:VMwork 要使终端不弹出, #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") 还要实现jmp near 0x01类似的 本次的main.cpp #include <graphics.h> #include <conio.h> #include <windows.h> #includ…...
[c语言日寄]C语言类型转换规则详解
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
Rust 的基本类型有哪些,他们存在堆上还是栈上,是否可以COPY?
Rust 的基本类型主要包括以下几类: 1. 整数类型(Integer) Rust 提供了有符号和无符号的整数类型: 有符号整数(i8, i16, i32, i64, i128, isize)无符号整数(u8, u16, u32, u64, u128, usize&a…...
oracle 19C RAC打补丁到19.26
oracle 19CRAC打补丁到19.26 本文只保留简介命令和每个命令大概的用时,方便大家直接copy使用,并了解每个命令的预期时间,减少命令执行期的等待焦虑。 1.本次所需的补丁如下 p6880880_190000_Linux-x86-64.zip (.43的opatch&…...
利用Spring Batch简化企业级批处理应用开发
1. 引言 1.1 批处理的重要性 在现代企业系统中,批处理任务用于处理大量数据,如报表生成、数据迁移、日终结算等。这些任务通常不需要实时响应,但需要高效、可靠地完成。批处理可以显著提高系统性能,减少实时系统的负载,并确保数据的完整性和一致性。 1.2 Spring Batch简…...
三、js笔记
(一)JavaScript概述 1、发展历史 ScriptEase.(客户端执行的语言):1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言)Javascript:Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigat…...
C# 语言基础全面解析
.NET学习资料 .NET学习资料 .NET学习资料 一、引言 C# 是一种功能强大、面向对象且类型安全的编程语言,由微软开发,广泛应用于各种类型的软件开发,从桌面应用、Web 应用到游戏开发等领域。本文将全面介绍 C# 语言的基础知识,帮…...
基于SpringBoot的青年公寓服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Bash 基础与进阶实践指南
目录 Bash 简介与基础基本命令与文件操作权限管理与用户管理重定向与管道变量与环境变量通配符与正则表达式Shell 脚本结构与控制流常用内建命令与技巧文本处理常用命令作业控制与进程管理别名与函数实用技巧与注意事项更多 Bash 进阶话题参考资源 1. Bash 简介与基础 1.1 什…...
深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据
深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据 一、服务器如何响应前端请求 前端与后端的交互主要通过 HTTP 协议实现。以下是详细步骤: 1. 前端发起 HTTP 请求 GET 请求:用于从服务器获取数据。POST 请求:用…...
使用LLaMA-Factory对AI进行认知的微调
使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…...
Kafka分区策略实现
引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中,合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略(默认) 轮询策略是 Kafka 默认的分区策略(当消息没有指定键时&…...
在无sudo权限Linux上安装 Ollama 并使用 DeepSeek-R1 模型
本教程将指导你如何在 Linux 系统上安装 Ollama(一个本地运行大型语言模型的工具),并加载 DeepSeek-R1 模型。DeepSeek-R1 是一个高性能的开源语言模型,适用于多种自然语言处理任务。 DeepSeek-R1 简介 DeepSeek-R1 是 DeepSeek …...
Vue.js `v-memo` 性能优化技巧
Vue.js v-memo 性能优化技巧 今天我们来聊聊 Vue 3.2 引入的一个性能优化指令:v-memo。如果你在处理大型列表或复杂组件时,遇到性能瓶颈,那么 v-memo 可能会成为你的得力助手。 什么是 v-memo? v-memo 是 Vue 3.2 新增的内置指…...
蓝桥杯思维训练营(一)
文章目录 题目总览题目详解翻之一起做很甜的梦 蓝桥杯的前几题用到的算法较少,大部分考察的都是思维能力,方法比较巧妙,所以我们要积累对应的题目,多训练 题目总览 翻之 一起做很甜的梦 题目详解 翻之 思维分析:一开…...
HBase-2.5.10 伪分布式环境搭建【Mac】
文章目录 前言一、搭建单节点Zookeeper1. 解压zookeeper2. 配置环境变量3. 修改配置文件4. 启动zk 二、搭建伪分布式Hbase1. 解压hbase2. 配置环境变量3. 修改配置4. 启动HBase 前言 搭建hbase伪分布式环境 提示:以下是本篇文章正文内容,下面案例仅供参…...
【小白学AI系列】NLP 核心知识点(五)Transformer介绍
Transformer Transformer 是一种基于自注意力机制(Self-Attention Mechanism)的深度学习模型,首次由 Vaswani 等人于 2017 年在论文《Attention is All You Need》中提出。与 RNN 和 LSTM 不同,Transformer 不需要依靠序列顺序进…...
纯后训练做出benchmark超过DeepseekV3的模型?
论文地址 https://arxiv.org/pdf/2411.15124 模型是AI2的,他们家也是玩开源的 先看benchmark,几乎是纯用llama3 405B后训练去硬刚出一个gpt4o等级的LLamA405 我们先看之前的机遇Lllama3.1 405B进行全量微调的模型 Hermes 3,看着还没缘模型…...
OpenAI深夜反击:o3-mini免费上线,能否撼动DeepSeek的地位?
还在为寻找合适的 AI 模型而烦恼吗?chatTools 平台为您精选 o1、GPT4o、Claude、Gemini 等顶尖 AI 模型,满足您不同的 AI 应用需求。立即体验强大的 AI 能力! 深夜反击,OpenAI祭出o3-mini 在DeepSeek异军突起,搅动AI行…...
【Linux-网络】初识计算机网络 Socket套接字 TCP/UDP协议(包含Socket编程实战)
🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚一、初识计算机网络 📖 背景 📖 网络协议 🔖OSI七层…...
使用ollama在本地部署一个deepseek大模型
文章目录 为什么选择本地化部署需要用到什么作者使用的什么环境如何根据自己的电脑或服务器配置选择自己能部署的大模型 一、Ollama1、下载Ollama2、安装Ollama 二、DeepSeek R11、下载DeepSeek R12、安装DeepSeek R1 三、ChatBox AI1、下载ChatBox AI2、安装ChatBox AI3、连接…...
10 Flink CDC
10 Flink CDC 1. CDC是什么2. CDC 的种类3. 传统CDC与Flink CDC对比4. Flink-CDC 案例5. Flink SQL 方式的案例 1. CDC是什么 CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数…...
【含文档+PPT+源码】基于微信小程序连锁药店商城
项目介绍 本课程演示的是一款基于微信小程序连锁药店商城,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带的…...
使用 EXISTS 解决 SQL 中 IN 查询数量过多的问题
在 SQL 查询中,当我们面对需要在 IN 子句中列举大量数据的场景时,查询的性能往往会受到显著影响。这时候,使用 EXISTS 可以成为一种优化的良方。 问题的来源 假设我们有两个表,orders 和 customers,我们需要查询所有…...
[免费]微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序智能商城系统(uniappSpringboot后端vue管理端),分享下哈。 项目视频演示 【免费】微信小程序智能商城系统(uniappSpringboot后端vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…...
UE学习日志#19 C++笔记#5 基础复习5 引用1
C中的引用(reference)是另一个变量的别名。对引用的所有修改都会更改其引用的变量的值。可以将引用视为隐式指针,它省去了获取变量地址和解引用指针的麻烦。另外,可以将引用视为原始变量的另一个名称。可以创建独立的引用变量&…...
PHP代码审计学习02
目录 代码审计一般思路 Beescms代码审计(upload) Finecms基于前台MVC任意文件上传挖掘思路 CLTPHP基于thinkphp5框架的文件上传挖掘思路 今天来看PHP有框架MVC类,文件上传,断点调试挖掘。 同样还是有关键字搜索和功能点抓包两…...
2025年02月02日Github流行趋势
项目名称:oumi 项目地址url:https://github.com/oumi-ai/oumi 项目语言:Python 历史star数:1416 今日star数:205 项目维护者:xrdaukar, oelachqar, taenin, wizeng23, kaisopos 项目简介:构建最…...
