當前位置:首頁 » 編程語言 » c語言簡單實現memcpy
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言簡單實現memcpy

發布時間: 2023-02-11 20:57:40

c語言實現字元串拷貝函數的幾種方法

首先是使用庫函數
比如下面代碼

void ourStrCopy(char S1[] , char S2[]){ strcpy(S1, S2); //該函數還有另一個版本可以按長度截取 }

還有一個函數是memcpy,這個是內存拷貝,原型是

void memcpy(void *dest, const void *src, size_t n); 需要注意的是這個函數第一個和第二個指針都是void型且第二個指針不能被修改,第三個參數是需要拷貝的內存長度按位元組記。

然後是用指針引用,注意這個並非賦值,而是引用,這種操作需要注意內存。

char s1[] = "abcdefg";//定義一組字元串char *s2 = s1;//按照指針拷貝字元串

第三種方法就是直接賦值了

void outStrCopy(char s1[] , char s2[]){ int len1 = strlen(s1);//獲取第一個字元串的長度 int len2 = strlen(s2);//獲取第二個字元串的長度 int len = 0; //字元串總長度 if(len1 <= len2){ len = len2; //選擇COPY的長度 }else{ len = len1; } for(int i = 0 ; i < len ; i++){ s1[i] = s2[i]; //實現數據拷貝 }}

② c語言如何實現結構體的深度復制

使用memcpy即可, 比如你另外建立一個結構體sortbook[1000]用來保存排序結果,將book中的第i個元素賦值到sortbook的第j個元素中
memcpy(&sortbook[j], &book[i], sizeof(struct book));
用這個函數需要#include <string.h>

函數原型
void *memcpy(void*dest, const void *src, size_t n);
功能
由src指向地址為起始地址的連續n個位元組的數據復制到以destin指向地址為起始地址的空間內。
頭文件
#include<string.h>
返回值
函數返回一個指向dest的指針。
說明
1.source和destin所指內存區域不能重疊,函數返回指向destin的指針。
2.與strcpy相比,memcpy並不是遇到'\0'就結束,而是一定會拷貝完n個位元組。

memcpy用來做內存拷貝,你可以拿它拷貝任何數據類型的對象,可以指定拷貝的數據長度;
例:
char a[100], b[50];
memcpy(b, a,sizeof(b)); //注意如用sizeof(a),會造成b的內存地址溢出。
strcpy就只能拷貝字元串了,它遇到'\0'就結束拷貝;例:
char a[100], b[50];
strcpy(a,b);
3.如果目標數組destin本身已有數據,執行memcpy()後,將覆蓋原有數據(最多覆蓋n)。如果要追加數據,則每次執行memcpy後,要將目標數組地址增加到你要追加數據的地址。
//注意,source和destin都不一定是數組,任意的可讀寫的空間均可。

③ c語言如何實現多維整型數組的復制

memcpy(目的地址,源地址,位元組數)
由於數組元素為連續內存存放
可以使用此函數,將源地址的內存內容,復制到目的地址去,位元組數為sizeof(數組名)

④ C語言中怎麼把一維數組賦給另外一個一維數組

不可以,之所以不可以是因為數組名是個常量,它的值是數組首元素地址,即不能將其它值付給這個常量。

可以採用循環的方法逐個復制,或者採用另一個同類型的指針(相對於數組名,指針是變數)指向要復制的數組,之後就可以採用這個指針訪問之前的那個數組。

(4)c語言簡單實現memcpy擴展閱讀:

當數組中每個元素都只帶有一個下標時,稱這樣的數組為一維數組。

一維數組是由數字組成的以單純的排序結構排列的結構單一的數組。一維數組是計算機程序中最基本的數組。二維及多維數組可以看作是一維數組的多次疊加產生的。數組是計算機編程中的重要概念,運用數組可以方便地處理大規模的數據。

⑤ memcpy與memmove的區別

memcpy和memmove都是C語言的庫函數,相比於strcpy和strncpy只能拷貝字元串數組,memcpy與memmove可以拷貝其它類型的數組,但是為什麼要同時提供兩種方法呢?本文主要就是介紹這兩個函數的區別。

首先來看函數原型:

這兩個函數都是將s2指向位置的n位元組數據拷貝到s1指向的位置,區別就在於關鍵字restrict, memcpy假定兩塊內存區域沒有數據重疊,而memmove沒有這個前提條件。如果復制的兩個區域存在重疊時使用memcpy,其結果是不可預知的,有可能成功也有可能失敗的,所以如果使用了memcpy,程序員自身必須確保兩塊內存沒有重疊部分。

我們來看一組示例:

正常情況下,即使內容有重疊,src的內容也可以正確地被拷貝到了dest指向的空間。

這種情況下,src的地址小於dest的地址,拷貝前3個位元組沒問題,但是拷貝第4,5個位元組時,原有的內容已經被src拷貝過來的字元覆蓋了,所以已經丟失原來src的內容,這很明顯就是問題所在。

一般來說,memcpy的實現非常簡單,只需要順序的循環,把位元組一個一個從src拷貝到dest就行:

memmove會對拷貝的數據作檢查,確保內存沒有覆蓋,如果發現會覆蓋數據,簡單的實現是調轉開始拷貝的位置,從尾部開始拷貝:

這里 __np_anyptrlt 是一個簡單的宏,用於結合拷貝的長度檢測dest與src的位置,如果dest和src指向同樣的對象,且src比dest地址小,就需要從尾部開始拷貝。否則就和memcpy處理相同。
但是實際在C99實現中,是將內容拷貝到臨時空間,再拷貝到目標地址中:

由此可見memcpy的速度比memmove快一點,如果使用者可以確定內存不會重疊,則可以選用memcpy,否則memmove更安全一些。另外一個提示是第三個參數是拷貝的長度,如果你是拷貝10個double類型的數值,要寫成sizeof(double)*10,而不僅僅是10。