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

面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述

文章目录

    • `sizeof` 和 `strlen`
    • 数组和链表
      • 总结
    • #include <>和 #include ""
    • #define 和typedef
    • 内存对齐概述
      • 对齐规则
      • 示例:结构体的内存对齐
        • 分析:
      • 内存对齐的常见规则:
      • 填充字节的计算
      • 对齐影响的实际例子

sizeofstrlen

特性sizeofstrlen
定义运算符,也是关键字,用于获取类型或变量所占的字节数函数,用于计算 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

#definetypedef 都是 C/C++ 中常用的预处理指令和关键字,主要用于定义常量、宏和类型别名。它们有不同的功能和使用方式,下面是详细的比较:

特性#definetypedef
用途用于定义宏(常量、函数、代码片段)用于定义类型别名(为现有类型起别名)
作用范围在宏定义之后,它的作用范围是整个文件在定义之后,它的作用范围通常是当前作用域或文件
类型检查不进行类型检查,纯粹的文本替换进行类型检查,确保新类型的合法性
宏定义的作用定义常量、简单函数或复杂的代码块不支持宏功能,只有类型别名
宏展开时机宏在预处理阶段展开(编译前)typedef 只是定义别名,不会进行宏展开
调试支持宏没有调试信息(因为宏只是简单的文本替换)typedef 可以像普通类型一样调试
示例#define PI 3.14typedef int Integer;

内存对齐概述

内存对齐(Memory Alignment)是计算机体系结构中对数据存储方式的一种要求,它规定了数据类型的存储地址必须是某个特定值的倍数。

在现代计算机中,通常要求数据按照一定的对齐方式存储,例如 4 字节对齐、8 字节对齐等。对齐通常会影响结构体和数组的内存布局,从而决定其内存占用的大小。

对齐规则

  1. 基本对齐规则

    • 每个数据类型的存储地址应当是该数据类型大小的倍数。例如:
      • char 类型通常是 1 字节,通常可以存储在任何地址。
      • int 类型通常是 4 字节,存储地址必须是 4 的倍数。
      • double 类型通常是 8 字节,存储地址必须是 8 的倍数。
  2. 结构体对齐

    • 对结构体中的成员进行对齐时,结构体的总大小将是最大成员对齐要求的倍数。
    • 结构体中每个成员的起始地址需要满足其对齐要求。如果某个成员的起始地址不符合其对齐要求,编译器会在它和下一个成员之间插入填充字节(padding bytes)来保证对齐。
  3. 结构体总大小

    • 结构体的总大小应该是最大对齐要求的倍数。如果结构体中的成员总和大小不满足最大对齐要求,编译器会在结构体末尾添加填充字节,以使结构体的总大小是对齐要求的倍数。

示例:结构体的内存对齐

考虑以下代码:

#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 字节。

内存对齐的常见规则:

数据类型对齐方式描述
char1 字节char 类型的对齐方式为 1 字节。
short2 字节short 类型的对齐方式为 2 字节。
int4 字节int 类型的对齐方式为 4 字节。
float4 字节float 类型的对齐方式为 4 字节。
double8 字节double 类型的对齐方式为 8 字节。
long4 字节或8字节long 类型的对齐方式依赖于系统架构。
long long8 字节long long 类型的对齐方式为 8 字节。

填充字节的计算

考虑以下结构体定义:

typedef struct {char c;    // 1 字节int i;     // 4 字节
} MyStruct;
  1. char c 占 1 字节,紧接着是 int i,但是 int 类型要求 4 字节对齐。因此,编译器会在 char 后插入 3 个填充字节,使 int 的起始地址是 4 的倍数。

  2. 所以,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 字节对齐)。

计算结构体内存:

  1. char c 占 1 字节。
  2. 插入 3 字节填充,使 int i 能够 4 字节对齐。
  3. int i 占 4 字节。
  4. double d 占 8 字节,且由于对齐要求,double 的起始地址必须是 8 的倍数。
  5. 结构体的总大小会被扩展到 16 字节,以满足 8 字节对齐。

输出结果

Size of Example: 16

以最大类型所占内存分配内存空间。

相关文章:

面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述

文章目录 sizeof 和 strlen数组和链表总结 #include <>和 #include ""#define 和typedef内存对齐概述对齐规则示例&#xff1a;结构体的内存对齐分析&#xff1a; 内存对齐的常见规则&#xff1a;填充字节的计算对齐影响的实际例子 sizeof 和 strlen 特性size…...

使用 Kotlin 将 Vertx 和 Springboot 整合

本篇文章目的是将 Springboot 和 Vertx 进行简单整合。整合目的仅仅是为了整活&#xff0c;因为两个不同的东西整合在一起提升的性能并没有只使用 Vertx 性能高&#xff0c;因此追求高性能的话这是在我来说不推荐。而且他们不仅没有提高很多性能甚至增加了学习成本 一、整合流…...

线性回归算法-01

线性回归简介 学习目标 了解线性回归的应用场景知道线性回归的定义 1 线性回归应用场景 房价预测销售额度预测贷款额度预测 2 什么是线性回归 2.1 定义与公式 线性回归(Linear regression)是利用 回归方程(函数)对 一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模…...

洛谷 P1130 红牌 C语言

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂&#xff0c;一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程&#xff0c;每一步政府都派了 M 个工作人员来检查材料。不幸的是&…...

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…...

线性代数复习笔记

1. 课程学习 1.1 3Blue1Brown 线性代数 2. 基本术语 eigenvector&#xff08;特征向量&#xff09;&#xff1a;线性变换中方向保持不变的向量 可以视作3D旋转矩阵形成的旋转的轴...

你需要更深层次的解放

先谈一谈理性认知中的属性替换原则。简单来说&#xff0c;属性替换就是用简单的问题取代难题。 当人们需要评估属性A时&#xff0c;却发现评估属性B更容易一些&#xff08;A与B之间存在一定的关系&#xff09;&#xff0c;于是就改为评估属性B。这叫做属性替换。 作为一种认知…...

机器学习算法在网络安全中的实践

机器学习算法在网络安全中的实践 本文将深入探讨机器学习算法在网络安全领域的应用实践&#xff0c;包括基本概念、常见算法及其应用案例&#xff0c;从而帮助程序员更好地理解和应用这一领域的技术。"> 序言 网络安全一直是信息技术领域的重要议题&#xff0c;随着互联…...

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中&#xff0c;所有事件都继承自 QEvent &#xff0c;并且每个事件都有特定的标识符&#xff0c;如&#xff1a;Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…...

DeepSeek相关技术整理

相关介绍 2024年12月26日&#xff0c;DeepSeek V3模型发布&#xff08;用更低的训练成本&#xff0c;训练出更好的效果&#xff09;671B参数&#xff0c;激活37B。2025年1月20日&#xff0c;DeepSeek-R1模型发布&#xff08;仅需少量标注数据&#xff08;高质量长cot&#xff…...

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…...

蓝桥杯之c++入门(二)【输入输出(上)】

目录 前言1&#xff0e;getchar和 putchar1.1 getchar()1.2 putchar() 2&#xff0e;scanf和 printf2.1 printf2.1.1基本用法2.1.2占位符2.1.3格式化输出2.1.3.1 限定宽度2.1.3.2 限定小数位数 2.2 scanf2.2.1基本用法2.2.2 占位符2.2.3 scanf的返回值 2.3练习练习1&#xff1a…...

消息队列应用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系统设计》P343-P347

消息队列 使用信号量、事件标志组和线标志进行任务同步时&#xff0c;只能提供同步的时刻信息&#xff0c;无法在任务之间进行数据传输。要实现任务间的数据传输&#xff0c;一般使用两种方式&#xff1a; 1. 全局变量 在 RTOS 中使用全局变量时&#xff0c;必须保证每个任务…...

算法题(55):用最少数量的箭引爆气球

审题&#xff1a; 本题需要我们找到最少需要的箭数&#xff0c;并返回 思路: 首先我们需要把本题描述的问题理解准确 &#xff08;1&#xff09;arrow从x轴任一点垂直射出 &#xff08;2&#xff09;一旦射出&#xff0c;无限前进 也就是说如果气球有公共区域&#xff08;交集&…...

谭浩强C语言程序设计(4) 8章(下)

1、输入三个字符串按照字母顺序从小到大输出 #include <cstdio> // 包含cstdio头文件&#xff0c;用于输入输出函数 #include <cstring> // 包含cstring头文件&#xff0c;用于字符串处理函数#define N 20 // 定义字符串的最大长度为20// 函数&#xff1a;…...

AlexNet论文代码阅读

论文标题&#xff1a; ImageNet Classification with Deep Convolutional Neural Networks 论文链接&#xff1a; https://volctracer.com/w/BX18q92F 代码链接&#xff1a; https://github.com/dansuh17/alexnet-pytorch 内容概述 训练了一个大型的深度卷积神经网络&#xf…...

62.病毒在封闭空间中的传播时间|Marscode AI刷题

1.题目 问题描述 在一个封闭的房间里摆满了座位&#xff0c;每个座位东西向和南北向都有固定 1 米的间隔。座位上坐满了人&#xff0c;坐着的人可能带了口罩&#xff0c;也可能没有带口罩。我们已经知道房间里的某个人已经感染了病毒&#xff0c;病毒的传播速度是每秒钟感染距…...

Elixir语言的安全开发

Elixir语言的安全开发 引言 在当今这个互联网高度发展的时代&#xff0c;软件的安全性变得越来越重要。随着网络攻击的增多&#xff0c;软件漏洞的频繁暴露&#xff0c;开发者面临着前所未有的安全挑战。Elixir&#xff0c;作为一种现代化的函数式编程语言&#xff0c;以其高…...

Rust 条件语句

Rust 条件语句 在编程语言中&#xff0c;条件语句是进行决策和实现分支逻辑的关键。Rust 语言作为一门系统编程语言&#xff0c;其条件语句的使用同样至关重要。本文将详细介绍 Rust 中的条件语句&#xff0c;包括其基本用法、常见场景以及如何避免常见错误。 基本用法 Rust…...

小红的合数寻找

A-小红的合数寻找_牛客周赛 Round 79 题目描述 小红拿到了一个正整数 x&#xff0c;她希望你在 [x,2x] 区间内找到一个合数&#xff0c;你能帮帮她吗&#xff1f; 一个数为合数&#xff0c;当且仅当这个数是大于1的整数&#xff0c;并且不是质数。 输入描述 在一行上输入一…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)

零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...

python数据结构和算法(1)

数据结构和算法简介 数据结构&#xff1a;存储和组织数据的方式&#xff0c;决定了数据的存储方式和访问方式。 算法&#xff1a;解决问题的思维、步骤和方法。 程序 数据结构 算法 算法 算法的独立性 算法是独立存在的一种解决问题的方法和思想&#xff0c;对于算法而言&a…...

暴雨新专利解决服务器噪音与性能悖论

6月1日&#xff0c;我国首部数据中心绿色化评价方面国家标准《绿色数据中心评价》正式实施&#xff0c;为我国数据中心的绿色低碳建设提供了明确指引。《评价》首次将噪音控制纳入国家级绿色评价体系&#xff0c;要求从设计隔声结构到运维定期监测实现闭环管控&#xff0c;加速…...