嵌入式开发学习(第二阶段 C语言笔记)

内存操作

我们对于内存操作需要依赖于string.h头文件中相关的函数库。

内存操作函数

内存填充
  • 头文件:#include <string.h>

  • 函数原型:

    void* memset(void *s,int c,size_t n)
    
  • 函数功能:将内存块s的前n个字节填充为c,一般用于初始化或者清零操作。

  • 参数说明:

    • s:目标内存首地址
    • c:填充值(以unsigned char形式处理(0~255)))
    • n:填充字节数
  • 返回值:

    • 成功:返回s的指针
    • 失败:返回NULL
  • 注意事项:

    • 常用于动态化初始化,c通常设置为0(清零)
    • 按字节填充,非整型初始化需要谨慎(如填充it数组时,0是安全的)
  • 案例:

/*************************************************************************> File Name:    demo01.c> Author:       小刘> Description:  > Created Time: 2025年05月26日 星期一 10时02分49秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc,char *argv[])
{// 在堆内存中申请4个int的连续空间int *p = (int*)malloc(4 * sizeof(int));// 非空校验if(p == NULL){perror("内存申请失败!");//perror不需要加换行符,它可以自己换行return -1;}// 初始化堆内存,填充0memset(p,0,4 * sizeof(int));//默认初始中值为0,例如:填充后两个memset(p + 2,0,);// 测试输出printf("%d\n",p[1]);// p[1] 的底层实现 *(p+1)  我们可以将p[1]看作是 *(p+1) 语法糖// 内存使用完毕要,释放free(p);// 对指针赋值NULLp = NULL;return 0;
}
内存拷贝
  • 头文件:#include <string.h>

  • 函数原型:

    • 源与目标内存无重叠时使用

      void* memcpy(void* dest, const void* src,size_t n);
      
    • 安全处理内存重叠

      void* memmove(void* dest, const void* src,size_t n);
      
  • 函数功能:将stc的前n个字拷贝到dest

  • 参数说明:

    • dest:目标内存首地址
    • stc:源内存首地址
    • size_t n :拷贝的字节数
  • 返回值:

    • 成功:返回 dest 的首地址
    • 失败:返回NULL
  • 注意事项:

    • memmove 能正确处理内存重叠,推荐优先使用
    • 确保目标内存足够大,避免溢出。
  • 示例

/*************************************************************************> File Name:    demo02.c> Author:       小刘> Description:  > Created Time: 2025年05月26日 星期一 10时45分19秒************************************************************************/#include <stdio.h>
#include <string.h>int main(int argc,char *argv[])
{// 准备两个数组,用来存储和目标int src[4] = {11,22,33,44};int dest[6] = {111,222,333,444,555,666};// 进行拷贝// memcpy()memmove(dest+1,src+1,2 * sizeof(int));printf("源数组:");register int i;for(i = 0; i < 4; i++)printf("%-6d",src[i]);printf("\n目标数组:");for(i = 0; i < 4; i++)printf("%-6d",dest[i]);printf("\n");return 0;
}

思考:什么是内存重叠?

内存比较
  • 头文件:#include <string.h>

  • 函数原型:

    int memcmp(const void* s1, const void* s2,size_t n);
    
  • 函数功能:比较s1 s2的前n个字节

  • 返回值:

    • 0:内存内容相同
    • >0s1中第一个不同字节大于s2
    • <0s1中第一个不同字节小于s2
  • 注意事项:比较按字节进行,非字符串需确保长度一致(总字节数一致)。

  • 示例:

    /*************************************************************************> File Name:    demo03.c> Author:       刘孟丹> Description:  > Created Time: 2025年05月26日 星期一 11时20分03秒************************************************************************/#include <stdio.h>
    #include <string.h>
    #include <stdlib.h>int main(int argc,char *argv[])
    {// 准备比较的数据int* arr1 = (int *)malloc(3 * sizeof(int));//3个元素int* arr2 = (int *)calloc(4 , sizeof(int));//4个元素// 清零memset(arr1,0,3 * sizeof(int));// 赋值arr1[0] = 60;arr2[1] = 66;arr2[0] = 70;arr2[1] = 5;// 比较int cmp_result = memcmp(arr2,arr1,2* sizeof(int));printf("比较结果:%d-(%s)\n",cmp_result,cmp_result > 0 ?"大于":cmp_result < 0 ?"小于" :"等于");free(arr1);free(arr2);arr1 = arr2 = NULL;return 0;
    }
    
内存查找
  • 头文件:#include <string.h>

  • 函数原型:

    • 正向查找:C语言标准
    void* mem(void* dest, const void* src,size_t n);
    
    • 反向查找

      void* memchar(void* dest, const void* src,size_t n);
      
  • 函数功能:在 s 的前 n 个字节中查找字符c

  • 返回值:

    • 成功:返回找到内容对应地址
    • 失败:返回NULL
  • 注意事项:

    • memch
    • 是GNU扩展函数,需手动声明(只要不是C语言标准提供,编译的时候都需要手动声明或链接)
    • 查找单位为字节值,非整型数据需要注意内存布局
  • 示例:

    /*************************************************************************> File Name:    demo04.c> Author:       刘孟丹> Description:  > Created Time: 2025年05月26日 星期一 11时41分52秒************************************************************************/#include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    extern void* memchr(const void*,int,size_t);
    extern void* memrchr(const void*,int,size_t);int main(int argc,char *argv[])
    {//准备一个测试数组char str[] = {'A','B','C','B'};// 查找字符‘B’char *first = (char*) memchr(str,'B',sizeof(str));char *last = (char*) memrchr(str,'B',sizeof(str));printf("first= %p,last=%p\n",first,last);printf("第一个B的位置,%ld\n",first - str);printf("最后一个B的位置,%ld\n",last - str);return 0;
    }
    

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

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

相关文章

C++学习-入门到精通【9】面向对象编程:继承

C学习-入门到精通【9】面向对象编程&#xff1a;继承 目录 C学习-入门到精通【9】面向对象编程&#xff1a;继承一、基类与派生类CommunityMember类的继承层次结构如何定义一个派生类呢 二、基类和派生类间的关系1.创建并使用类CommissionEmployee2.不使用继承创建类BasePlusCo…

黑马k8s(十七)

一&#xff1a;高级存储 1.高级存储-pv和pvc介绍 2.高级存储-pv 3.高级存储-pvc 最后一个改成5gi pvc3是没有来绑定成功的 pv3没有绑定 删除pod、和pvc&#xff0c;观察状态&#xff1a; 4.高级存储-pc和pvc的生命周期 二&#xff1a;配置存储 1.配置存储-ConfigMap 2.配…

cf每日刷题c++

目录 Simple Repetition&#xff08;1000&#xff09; Fashionable Array&#xff08;800&#xff09; Kevin and Arithmetic(800) Permutation Warm-Up(800) Game of Mathletes(900) LRC and VIP(800) Simple Repetition&#xff08;1000&#xff09; https://codeforc…

历年中国科学技术大学计算机保研上机真题

2025中国科学技术大学计算机保研上机真题 2024中国科学技术大学计算机保研上机真题 2023中国科学技术大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school?classification1 拆分数字 题目描述 给定一个数字&#xff0c;拆分成若干个数字之和&#xff…

PHP学习笔记(十一)

类常量 可以把在类中始终保持不变的值定义为常量&#xff0c;类常量的默认可见性是public。 接口中也可以定义常量。 可以用一个变量来动态调用类&#xff0c;但该变量的值不能为关键字 需要注意的是类常量只为每个类分配一次&#xff0c;而不是为每个类的实例分配。 特殊的…

Nginx 性能优化全解析:从进程到安全的深度实践

一、进程优化&#xff1a;释放硬件性能潜力 Nginx 通过多工作进程处理请求&#xff0c;合理配置进程参数能充分利用 CPU 资源&#xff0c;避免资源浪费。 1.1 worker_processes 参数详解 worker_processes用于设置 Nginx 工作进程的数量&#xff0c;它直接影响 Nginx 对 CP…

中国移动咪咕助力第五届全国人工智能大赛“AI+数智创新”专项赛道开展

第五届全国人工智能大赛由鹏城实验室主办&#xff0c;新一代人工智能产业技术创新战略联盟承办&#xff0c;华为、中国移动、鹏城实验室科教基金会等单位协办&#xff0c;广东省人工智能与机器人学会支持。 大赛发布“AI图像编码”、“AI增强视频质量评价”、“AI数智创新”三大…

《 PyTorch 2.3革新:torch.compile自动生成CUDA优化内核全解》

CUDA作为NVIDIA推出的并行计算平台和编程模型&#xff0c;为GPU计算提供了强大的支持&#xff0c;但手动优化CUDA代码不仅需要深厚的专业知识&#xff0c;而且过程繁琐、耗时费力&#xff0c;torch.compile的出现&#xff0c;犹如一道曙光&#xff0c;为解决这一困境带来了全新…

mysql-mysql源码本地调试

前言 先进行mysql源码本地编译&#xff1a;mysql源码本地编译 1.本地调试 这里以macbook为例 1.使用vscode打开mysql源码 2.创建basedir目录、数据目录、配置文件目录、配置文件 cd /Users/test/ mkdir mysqldir //创建数据目录和配置目录 cd mysqldir mkdir conf data …

带你手写React中的useReducer函数。(底层实现)

文章目录 前言一、为什么需要 Reducer&#xff1f;二、Reducer 的核心概念1. Reducer 函数2. useReducer 钩子 三&#xff0c;手写react中的useReducer 总结 前言 在 React 开发中&#xff0c;useReducer 是管理复杂状态逻辑的利器。它类似于 Redux 的简化版&#xff0c;允许我…

用wireshark抓了个TCP通讯的包

昨儿个整理了下怎么用wireshark抓包&#xff0c;链接在这里&#xff1a;捋捋wireshark 今天打算抓个TCP通讯的包试试&#xff0c;整体来说比较有收获&#xff0c;给大家汇报一下。 首先就是如何搞到可以用来演示TCP通讯的客户端、服务端&#xff0c;问了下deepseek&#xff0c;…

运维 pgsql 安装完后某次启动不了

pgsql 安装完后某次启动不了 错误 data directory "/usr/local/postgresql/data" has invalid permissions 安装成功后一直可以 后面同事敲了 chmod -R 777 /usr/local 导致不行 改到了 /usr/local/postgresql/data 权限 /usr/local/postgresql/data的权限有限…

查看·电脑安装·的 .NET 版本

方法 一&#xff1a;使用命令提示符或 PowerShell 打开命令提示符或 PowerShell。 输入以下命令&#xff1a;dotnet --version 按下回车键。 命令输出将显示已安装的 .NET 版本。 方法二&#xff1a;使用 .NET Framework 控制面板 打开控制面板。 点击“程序”。 点击“程序…

Linux WiFi 模组使用及故障排查整理文档

Linux WiFi 模组使用及故障排查整理文档 1. STA 模式下 WiFi 延时不稳定问题解决方法&#xff1a; 2. Power Saving 机制说明3. AP 模式下 WiFi 设置4. RTL8821CS AP 模式下 Windows 客户端异常断开问题问题描述问题原因解决方案步骤 1&#xff1a;修改 dnsmasq 配置步骤 2&…

mac mini m4命令行管理员密码设置

附上系统版本图 初次使用命令行管理员&#xff0c;让输入密码&#xff0c;无论是输入登录密码还是账号密码&#xff0c;都是错的&#xff0c;百思不得其解&#xff0c;去网上搜说就是登录密码啊 直到后来看到了苹果官方的文档 https://support.apple.com/zh-cn/102367 https…

栈内行为分析

栈内行为分析 一、源码分析 我们以以下简单的 C 程序为例&#xff0c;通过 GDB 动态调试分析函数调用过程中的栈内布局变化&#xff1a; #include <stdio.h> int add(){int a 10;int b 20;return (a b); }int main() {add();return 0; }编译为 32 位程序&#xff1a…

老旧设备数据采集破局 AI图像解析如何让质检LIMS系统焕发新生

在实验室数字化进程中&#xff0c;大量服役超过 10 年的老旧设备成为数据采集的 “拦路虎”&#xff1a;指针式仪表盘需人工读取、纸质原始记录靠手工录入、非标准接口设备数据无法自动获取…… 某化工实验室因 15 台老旧设备数据采集耗时占比达 40%&#xff0c;检测效率长期滞…

【征求意见】四川省大数据发展研究会关于对《数据资源建设费用测算标准》团体标准征求意见的通知

四川省大数据发展研究会 关于对《数据资源建设费用测算标准》团体标准征求意见的通知 各有关单位&#xff1a; 由四川省大数据发展研究会归口、成都东契奇科技有限公司牵头编制的《数据资源建设费用测算标准》团体标准已形成征求意见稿&#xff0c;现公开征求意见。请于2025年…

element上传文件多选 实现文件排序

上传文件多选排序 只上代码 不多逼逼 这是el-elment 的文件上传 <el-uploadaction"#"list-type"picture-card"ref"upload":accept"accept":on-change"onUploadChange":file-list"fileList":http-request&quo…

.NET 查找 DLL 的路径顺序

在 C# 中&#xff0c;[DllImport("SgCamWrapper.dll")] 这行代码表明它会在运行时从当前可执行文件的搜索路径中查找 SgCamWrapper.dll。具体搜索顺序如下&#xff08;按优先级&#xff09;&#xff1a; ✅ .NET 查找 DLL 的路径顺序&#xff1a; 应用程序启动目录&a…