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

c語言memcpy是深拷貝嗎

發布時間: 2022-11-22 04:58:22

A. memcpy在c語言中的含義,與strcpy區別

兩者最重要的區別是:memcpy可以進行內存地址重疊的拷貝。一個正確的strcpy原型編寫,要考慮到內存地址是否重疊的問題。。。

B. 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. C語言的strcpy和memcpy有啥區別啊,能舉例說明嗎,謝謝了。

strcpy是按字元串的長度進行拷貝,而memcpy是按指定的位元組數進行拷貝。

打個比方,char str[20]是一個最多可以裝下20個字元的串,但實際它的值是"abcde"5個字元,那麼你用strcpy得到的就是一個只有6個字元的串(包括最後的'\0'),相當於char s[6]。而你使用memcpy,指定拷貝20個位元組,那麼你就可以得到比"abcde\0"更長的內容,包括\0後面的也會拷貝過去。

D. 關於c語言數組的memcpy的一個問題

你這代碼編譯都不會過,怎麼還會有輸出?s、a、b在哪裡?又,memcpy是按位元組數拷貝的,你寫的memcpy(q+1,b+12,4);拷貝位元組數是4,拷貝到q+1起的4個位元組上,並沒有越界,若原來有'\0',那'\0'還在;若原來沒有,拷貝後還是沒有。

E. 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。

F. C語言串拷貝(strcpy)和內存拷貝(memcpy)函數有什麼不同

strcpy()函數只能拷貝字元串。strcpy()函數將源字元串的每個位元組拷貝到目錄字元串中,當遇到字元串末尾的null字元(\0)時,它會刪去該字元,並結束拷貝。 memcpy()函數可以拷貝任意類型的數據。因為並不是所有的數據都以null字元結束,所以你要為memcpy()函數指定要拷貝的位元組數。 在拷貝字元串時,通常都使用strcpy()函數;在拷貝其它數據(例如結構)時,通常都使用memcpy()函數。以下是一個使用strcpy()函數和memcpy()函數的例子: #include <stdio. h> #include <string. h> typedef struct cust-str {int id ;char last_name [20] ; char first_name[l5];} CUSTREC;void main (void); void main (void){char * src_string = "This is the source string" ; char dest_string[50]; CUSTREC src_cust; CUSTREC dest_cust; printf("Hello! I'm going to src_string into dest_string!\n"); / * Copy src_ string into dest-string. Notice that the destination string is the first argument. Notice also that the strcpy() function returns a pointer to the destination string. * / printf("Done! dest_string is: %s\n" , strcpy(dest_string, src_string)) ; printf("Encore! Let's one CUSTREC to another. \n") ; prinft("I'll src_cust into dest_cust. \n"); / * First, intialize the src_cust data members. * / src_cust. id = 1 ; strcpy(src_cust. last_name, "Strahan"); strcpy(src_cust. first_name, "Troy"); / * Now, Use the memcpy() function to the src-cust structure to the dest_cust structure. Notice that, just as with strcpy(), the destination comes first. * / memcpy(&dest_cust, &src_cust, sizeof(CUSTREC));

G. memcpy函數用法

memcpy函數用法

memcpy指的是c和c++使用的內存拷貝函數,memcpy函數的功能是從源內存地址的起始位置開始拷貝若干個位元組到目標內存地址中。

strcpy和memcpy主要有以下3方面的區別。

1、復制的內容不同。strcpy只能復制字元串,而memcpy可以復制任意內容,例如字元數組、整型、結構體、類等。

2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字元的串結束符""才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。

3、用途不同。通常在復制字元串時用strcpy,而需要復制其他類型數據時則一般用memcpy

H. c語言中strcpy跟mencpy哪個效率更高

mencpy為內存拷貝函數,直接指針操作內存塊,不考慮存儲的內容,效率高,但操作不當容易出錯
strcpy為字元串拷貝函數,必須提供源字元串指針和目標字元串指針 速度上比不過mencpy,但更具針對性,拷貝字元串時建議用strcpy不要用mencpy

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都不一定是數組,任意的可讀寫的空間均可。

J. memcpy和memmove的區別

memcpy和memmove()都是C語言中的庫函數,在頭文件string.h中,作用是拷貝一定長度的內存的內容,原型分別如下:
void *memcpy(void *dst, const void *src, size_t count);

void *memmove(void *dst, const void *src, size_t count);

他們的作用是一樣的,唯一的區別是,當內存發生局部重疊的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。

二者的c語言實現很簡單,有興趣的朋友可以去看看。在實際情況下,這兩個函數都是用匯編實現的。

memmove在兩個有重疊區域的內存時可以保證的正確,而mem就不行了,但mem比memmove的速度要快一些,如:
char s[] = "1234567890";
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)與memmove(p2, p1, 5)的結果就可能是不同的,memmove()可以將p1的頭5個字元"12345"正確拷貝至p2,而memcpy()的結果就不一定正確了.

和memcpy相比,src和des有重疊的情況下,memmove可以保證數據的完整性.

memmove保證的原因很簡單,就是針對重疊的情況做特殊處理,因此速度會比memcpy慢一些

具體的演算法並不難想,畫個圖,分兩種情況
1. src的尾部和des的頭部重合
從src尾部開始,以地址 -- 的方式到des
2. src的頭部和des的尾部重合
從src頭部開始,以地址 ++ 的方式到des