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

news2025/2/3 21:15:50

文章目录

    • `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

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

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

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

相关文章

低代码系统-产品架构案例介绍、炎黄盈动-易鲸云(十二)

易鲸云作为炎黄盈动新推出的产品&#xff0c;在定位上为低零代码产品。 开发层 表单引擎 表单设计器&#xff0c;包括设计和渲染 流程引擎 流程设计&#xff0c;包括设计和渲染&#xff0c;需要说明的是&#xff1a;采用国际标准BPMN2.0&#xff0c;可以全球通用 视图引擎 视图…

自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)

开源地址:VMwork 要使终端不弹出&#xff0c; #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语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

利用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…

基于SpringBoot的青年公寓服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

使用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. 预览…

在无sudo权限Linux上安装 Ollama 并使用 DeepSeek-R1 模型

本教程将指导你如何在 Linux 系统上安装 Ollama&#xff08;一个本地运行大型语言模型的工具&#xff09;&#xff0c;并加载 DeepSeek-R1 模型。DeepSeek-R1 是一个高性能的开源语言模型&#xff0c;适用于多种自然语言处理任务。 DeepSeek-R1 简介 DeepSeek-R1 是 DeepSeek …

蓝桥杯思维训练营(一)

文章目录 题目总览题目详解翻之一起做很甜的梦 蓝桥杯的前几题用到的算法较少&#xff0c;大部分考察的都是思维能力&#xff0c;方法比较巧妙&#xff0c;所以我们要积累对应的题目&#xff0c;多训练 题目总览 翻之 一起做很甜的梦 题目详解 翻之 思维分析&#xff1a;一开…

纯后训练做出benchmark超过DeepseekV3的模型?

论文地址 https://arxiv.org/pdf/2411.15124 模型是AI2的&#xff0c;他们家也是玩开源的 先看benchmark&#xff0c;几乎是纯用llama3 405B后训练去硬刚出一个gpt4o等级的LLamA405 我们先看之前的机遇Lllama3.1 405B进行全量微调的模型 Hermes 3&#xff0c;看着还没缘模型…

OpenAI深夜反击:o3-mini免费上线,能否撼动DeepSeek的地位?

还在为寻找合适的 AI 模型而烦恼吗&#xff1f;chatTools 平台为您精选 o1、GPT4o、Claude、Gemini 等顶尖 AI 模型&#xff0c;满足您不同的 AI 应用需求。立即体验强大的 AI 能力&#xff01; 深夜反击&#xff0c;OpenAI祭出o3-mini 在DeepSeek异军突起&#xff0c;搅动AI行…

【Linux-网络】初识计算机网络 Socket套接字 TCP/UDP协议(包含Socket编程实战)

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、初识计算机网络 &#x1f4d6; 背景 &#x1f4d6; 网络协议 &#x1f516;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&#xff08;变更数据获取&#xff09;的简称。核心思想是&#xff0c;监测并捕获数据库的变动&#xff08;包括数据或数…

【含文档+PPT+源码】基于微信小程序连锁药店商城

项目介绍 本课程演示的是一款基于微信小程序连锁药店商城&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带的…

[免费]微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序智能商城系统(uniappSpringboot后端vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序智能商城系统(uniappSpringboot后端vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

2025年02月02日Github流行趋势

项目名称&#xff1a;oumi 项目地址url&#xff1a;https://github.com/oumi-ai/oumi 项目语言&#xff1a;Python 历史star数&#xff1a;1416 今日star数&#xff1a;205 项目维护者&#xff1a;xrdaukar, oelachqar, taenin, wizeng23, kaisopos 项目简介&#xff1a;构建最…

vue入门到实战 三

目录 3.1 v-bind 3.1.1 v-bind指令用法 ​编辑3.1.2 使用v-bind绑定class 3.1.3 使用v-bind绑定style 3.2.1 v-if指令 3.2.1 v-if指令 3.2.2 v-show指令 ​3.3 列表渲染指令v-for 3.3.1 基本用法 3.3.2 数组更新 3.3.3 过滤与排序 3.4 事件处理 3.4.1 使用v-on指令…

实验六 项目二 简易信号发生器的设计与实现 (HEU)

声明&#xff1a;代码部分使用了AI工具 实验六 综合考核 Quartus 18.0 FPGA 5CSXFC6D6F31C6N 1. 实验项目 要求利用硬件描述语言Verilog&#xff08;或VHDL&#xff09;、图形描述方式、IP核&#xff0c;结合数字系统设计方法&#xff0c;在Quartus开发环境下&#xff…

java SSM框架 商城系统源码(含数据库脚本)

商城购物功能&#xff0c;项目代码&#xff0c;mysql脚本&#xff0c;html等静态资源在压缩包里面 注册界面 登陆界面 商城首页 文件列表 shop/.classpath , 1768 shop/.project , 1440 shop/.settings/.jsdtscope , 639 shop/.settings/org.eclipse.core.resources.prefs , …