嵌入式開發學習(第二階段 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
繁體地址,請注明出處:http://hk.pswp.cn/web/81958.shtml
英文地址,請注明出處:http://en.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…