memcpy的使?和模擬實現

目錄

一:memcpy的使?

memcpy的使?的代碼

二:memcpy函數的模擬實現:

memcpy和strcpy的區別

用途:

安全性:

數據類型:

性能:

在字符串中的用法示例:

memcpy:

strcpy

一:memcpy的使?

這是memcpy在庫里的定義,具體可在cplusplus.com查看

void * memcpy ( void * destination, const void * source, size_t num )

?num單位是字節,下面的模擬實現需要強制類型轉換

?函數memcpy從source的位置開始向后復制num個字節的數據到destination指向的內存位置。

? 這個函數在遇到 '\0' 的時候并不會停下來。

? 如果source和destination有任何的重疊,復制的結果都是未定義的。對于重疊的內存,交給memmove來處理。(下期會有)

memcpy的使?的代碼

#include <stdio.h> 
#include <string.h>
int main()
{    int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };    int arr2[10] = { 0 };   memcpy(arr2, arr1, 20);    int i = 0;    for (i = 0; i < 10; i++)  {      printf("%d ", arr2[i]);//結果是1 2 3 4 5 6 7 8 9 10   }   return 0; 
}

二:memcpy函數的模擬實現:

(模擬實現)就要嚴格按照庫里所規定的

void和void*的用法已經發布

#include<stdio.h>
#include<assert.h>
void * my_memcpy ( void * dst, const void * src, size_t count)
{   void * ret = dst;    assert(dst);    assert(src);    while (count--) {            *(char *)dst = *(char *)src;//強制類型轉換            dst = (char *)dst + 1;//強制類型轉換           src = (char *)src + 1;//強制類型轉換   }return(ret); 
}int main()
{	int arr1[]={1,2,3,4,5,6,7};int arr2[10]={0};void*p=my_memcpy(arr2,arr1,20);for(int i=0;i<10;i++){printf("%d ",*((int*)p+i));//強制類型轉換}return 0;} 

memcpy和strcpy的區別

C語言中memcpy和strcpy是兩個常用的字符串和內存操作函數,但它們在用途和行為上有明顯的區別。

memcpy和strcpy都可以用在字符串,memcpy和strncpy在字符串中的使用幾乎完全等價。

用途:

memcpy:是一個通用的內存復制函數,它用于從源地址(source)開始拷貝n個字節到目標地址(destination)。源地址和目標地址可以是任何類型的內存區域,但必須確保目標內存區域有足夠的空間來容納源內存區域的內容。
strcpy:是一個專門用于復制字符串的函數,它從源字符串(source string)的起始位置開始,逐個字符地復制到目標字符串(destination string)中,直到遇到源字符串中的空字符(null character, '\0')為止。這意味著strcpy會自動處理字符串的終止符。

安全性:

memcpy:不檢查目標內存區域是否足夠大以容納源內存區域的內容。如果目標內存區域小于源內存區域,那么memcpy將會導致緩沖區溢出(buffer overflow),這是一個嚴重的安全漏洞,可能導致程序崩潰或被惡意利用。
strcpy:同樣存在緩沖區溢出的風險,尤其是當目標字符串數組的大小不足以容納源字符串(包括終止符)時。然而,由于strcpy是專門為字符串設計的,所以它在某些情況下可能更容易被識別和避免這種風險(例如,使用更安全的替代品如strncpy)。

數據類型:

memcpy:可以復制任何類型的內存區域,包括字符串、整數、浮點數等。它只關心字節的數量和起始地址。
strcpy:只能用于復制字符串,即字符數組。

性能:

在大多數情況下,由于memcpy不需要檢查空字符,所以它可能比strcpy稍微快一些。然而,這種差異通常很小,而且在許多現代編譯器和優化器的優化下可能變得不明顯。

在字符串中的用法示例:

memcpy:

#include<stdio.h>
#include<string.h>
int main()
{char arr3[]="abcdef";char arr4[20];memcpy(arr4,arr3,4);printf("%s\n",arr4);//結果:abcd
}

strcpy:

#include<stdio.h>
int main()
{char arr5[]="abcdef";char arr6[20];strncpy(arr6,arr5,4);//strcpy(arr6,arr5);,不可以確切的復制字符串,只能全部復制進去printf("%s\n",arr6);//結果也是abcd}


注意:在使用memcpy和strcpy時,都應該確保目標內存區域有足夠的空間來容納源內存區域的內容,以避免緩沖區溢出。在實際編程中,更推薦使用更安全的替代品,如strncpy和strncpy_s(如果編譯器支持)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15705.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ajax面試題精選及參考答案(3萬字長文)

目錄 什么是Ajax,它的核心原理是什么? Ajax應用程序的優勢有哪些? Ajax最大的特點是什么?

Science 基于尖峰時序編碼的模擬神經觸覺系統,可實現動態對象分類

快速處理和有效利用手與物體交互過程中產生的動態觸覺信號&#xff08;例如觸摸和抓握&#xff09;對于觸覺探索和靈巧的物體操作至關重要。將電子皮膚&#xff08;e-skins&#xff09;推進到模仿自然觸覺的水平&#xff0c;是恢復截肢者和癱瘓患者喪失的功能的可行解決方案&am…

實現地圖上展示坐標時,不要全部展示、只展示幾個距離相對較大marker點位,隨著地圖放大再全部展示出來。

比例尺級別地面分辨率 &#xff08;米/像素&#xff09;比例尺0156543.031&#xff1a;591658700.82178271.5151&#xff1a;295829350.4239135.75751&#xff1a;147914675.2319567.878751&#xff1a;73957337.649783.9393751&#xff1a;36978668.854891.9696881&#xff1a…

電機控制系列模塊解析(22)—— 零矢量剎車

一、零矢量剎車 基本概念 逆變器通常采用三相橋式結構&#xff0c;包含六個功率開關元件&#xff08;如IGBT或MOSFET&#xff09;&#xff0c;分為上橋臂和下橋臂。每個橋臂由兩個反并聯的開關元件組成&#xff0c;上橋臂和下橋臂對應于電機三相繞組的正負端。正常工作時&…

mongodb在游戲開發領域的優勢

1、分布式id 游戲服務器里的大部分數據都是要求全局唯一的&#xff0c;例如玩家id&#xff0c;道具id。之所以有這種要求&#xff0c;是因為運營業務上需要進行合服操作&#xff0c;保證不同服的數據在進行合服之后&#xff0c;也能保證id不沖突。如果采用關系型數據庫&#x…

【C++題解】1699 - 輸出是2的倍數,但非3的倍數的數

問題&#xff1a;1699 - 輸出是2的倍數&#xff0c;但非3的倍數的數 類型&#xff1a;循環 題目描述&#xff1a; 請從鍵盤讀入一個整數 n&#xff0c;輸出 1~n 中所有是 2 的倍數&#xff0c;但非 3 的倍數的數&#xff0c;每行 1個。 比如&#xff0c;讀入一個整數10 &…

Spring AI實戰之二:Chat API基礎知識大串講(重要)

歡迎訪問我的GitHub 這里分類和匯總了欣宸的全部原創(含配套源碼)&#xff1a;https://github.com/zq2599/blog_demos Spring AI實戰全系列鏈接 Spring AI實戰之一&#xff1a;快速體驗(OpenAI)Spring AI實戰之二&#xff1a;Chat API基礎知識大串講(重要)SpringAIOllama三部曲…

Linux:進程地址空間、進程控制(一.進程創建、進程終止、進程等待)

上次介紹了環境變量&#xff1a;Linux&#xff1a;進程概念&#xff08;四.main函數的參數、環境變量及其相關操作&#xff09; 文章目錄 1.程序地址空間知識點總結上述空間排布結構是在內存嗎&#xff1f;&#xff08;進程地址空間引入&#xff09; 2.進程地址空間明確幾個點進…

NDIS小端口驅動開發(三)

微型端口驅動程序處理來自過度驅動程序的發送請求&#xff0c;并發出接收指示。 在單個函數調用中&#xff0c;NDIS 微型端口驅動程序可以指示具有多個接收 NET_BUFFER_LIST 結構的鏈接列表。 微型端口驅動程序可以處理對每個NET_BUFFER_LIST結構上具有多個 NET_BUFFER 結構的多…

JAVA -- > 初識JAVA

初始JAVA 第一個JAVA程序詳解 public class Main {public static void main(String[] args) {System.out.println("Hello world");} }1.public class Main: 類型,作為被public修飾的類,必須與文件名一致 2.public static 是JAVA中main函數準寫法,記住該格式即可 …

python皮卡丘動畫代碼

在Python中&#xff0c;我們可以使用多種方法來創建皮卡丘的動畫&#xff0c;例如使用matplotlib庫。 解決方案1&#xff1a;使用matplotlib庫 以下是一個使用matplotlib庫創建皮卡丘動畫的例子&#xff1a; import matplotlib.pyplot as plt import matplotlib.animation …

Slash后臺管理系統代碼閱讀筆記 如何實現環形統計圖表卡片?

目前&#xff0c;工作臺界面的上半部分已經基本梳理完畢了。 接下來&#xff0c;我們看看這個環形圖卡片是怎么實現的&#xff1f; 具體代碼如下&#xff1a; {/*圖表卡片*/} <Row gutter{[16, 16]} className"mt-4" justify"center">{/*環形圖表…

U盤引導盤制作Rufus v4.5.2180

軟件介紹 Rufus小巧實用開源免費的U盤系統啟動盤制作工具和格式化U盤的小工具&#xff0c;它可以快速將ISO鏡像文件制作成可引導的USB啟動安裝盤&#xff0c;支持Windows或Linux啟動&#xff0c;堪稱寫入鏡像速度最快的U盤系統制作工具。 軟件截圖 更新日志 github.com/pbat…

嵌入式全棧開發學習筆記---C語言筆試復習大全24

目錄 內存管理 內存分配 堆和棧的區別&#xff1f;&#xff08;面試重點&#xff09; 申請內存的函數 malloc realloc free gcc工具鏈 編譯的過程&#xff08;面試重點&#xff09; 第一步&#xff0c;預處理&#xff1a; 第二步&#xff0c;編譯&#xff1a; 第三…

【Spring Boot】使用 Redis + Cafeine 實現二級緩存

使用 Redis Caffeine 實現二級緩存可以有效提升應用的性能和緩存的命中率。Caffeine 是一個高效的 Java 本地緩存庫&#xff0c;而 Redis 是一個分布式緩存解決方案。通過將兩者結合&#xff0c;Caffeine 作為一級緩存用于快速訪問常用數據&#xff0c;Redis 作為二級緩存用于…

解決LabVIEW通過OPC Server讀取PLC地址時的錯誤180121602

在使用LabVIEW通過OPC Server讀取PLC地址時&#xff0c;若遇到錯誤代碼180121602&#xff0c;建議檢查網絡連接、OPC Server和PLC配置、用戶權限及LabVIEW設置。確保網絡暢通&#xff0c;正確配置OPC變量&#xff0c;取消緩沖設置以實時讀取數據&#xff0c;并使用診斷工具驗證…

簡述vue常用指令

Vue.js 提供了許多內置指令&#xff0c;這些指令用于在模板中添加特殊功能。以下是一些 Vue 的常用內置指令的簡要說明&#xff1a; v-text&#xff1a; 更新元素的 textContent。示例&#xff1a;<span v-text"message"></span> v-html&#xff1a; 更…

2 使用香橙派AIpro報錯 No module named ‘acllite utils‘

當使用jupyter運行香橙派的notebooks下面的案例的時候啟動使用jupyter lab 然后自動跳轉到jupyter頁面。如下圖: 這是自動跳轉過來的。然后運行下面的包的導入后報錯: 報錯為No module named ‘acllite utils’,那么我們打開notebooks文件夾下面的start_notebooks.sh文件:…

【C++練級之路】【Lv.21】C++11——列表初始化和聲明

快樂的流暢&#xff1a;個人主頁 個人專欄&#xff1a;《算法神殿》《數據結構世界》《進擊的C》 遠方有一堆篝火&#xff0c;在為久候之人燃燒&#xff01; 文章目錄 引言一、列表初始化1.1 內置類型1.2 結構體或類1.3 容器 二、聲明2.1 auto2.2 decltype2.3 nullptr 三、STL的…

A*算法搜索的路徑是最優的么?

A * 算法&#xff08;A* Search Algorithm&#xff09;是一種啟發式搜索算法&#xff0c;它旨在找到從起點到終點的最短路徑。在滿足以下條件時&#xff0c;A*算法能夠保證找到最優路徑&#xff1a; 啟發式函數的一致性&#xff08;Consistency&#xff09;或可采納性&#xf…