日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

strcpy,memcpy和memmove区别

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 strcpy,memcpy和memmove区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

strcpy和memcpy都是標準C庫函數,它們有下面的特點。
strcpy提供了字符串的復制。即strcpy只用于字符串復制,并且它不僅復制字符串內容之外,還會復制字符串的結束符。

已知strcpy函數的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般內存的復制。即memcpy對于需要復制的內容沒有限制,因此用途更廣。
void *memcpy( void *dest, const void *src, size_tcount);

char * strcpy(char * dest, const char * src) // 實現src到dest的復制
{if ((src == NULL) || (dest == NULL)) //判斷參數src和dest的有效性{return NULL;}char *strdest = dest;        //保存目標字符串的首地址while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的內容復制到dest下return strdest;
}
void *memcpy(void *memTo, const void *memFrom, size_t size)
{if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效return NULL;char *tempFrom = (char *)memFrom;             //保存memFrom首地址char *tempTo = (char *)memTo;                  //保存memTo首地址      while(size -- > 0)                //循環size次,復制memFrom的值到memTo中*tempTo++ = *tempFrom++ ;  return memTo;
}

strcpy和memcpy主要有以下3方面的區別。
1、復制的內容不同。strcpy只能復制字符串,而memcpy可以復制任意內容,例如字符數組、整型、結構體、類等。
2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。
3、用途不同。通常在復制字符串時用strcpy,而需要復制其他類型數據時則一般用memcpy

?

相關函數: bcopy(), memccpy(), memmove(), strcpy(), strncpy()
表頭文件: #include <string.h>
定義函數: void *memcpy(void *dest, const void *src, size_t n)
函數說明: memcpy()用來拷貝src所指的內存內容前n個字節到dest所指的內存地址上。與strcpy()不同的是,memcpy()會完整的復制n個字節,不會因為遇到字符串結束'\0'而結束
返回值:?? 返回指向dest的指針
附加說明: 指針src和dest所指的內存區域不可重疊



-------------------------------------------------------
#include <string.h>
#include <stdio.h>

int main()
{
??? char a[30] = "string (a)";
??? char b[30] = "hi\0zengxiaolong";
??? int i;

??? strcpy(a, b);???????????? //a[30] = "hi\0ing (a)"
??? printf("strcpy():");
??? for(i = 0; i < 30; i++)
??????? printf("%c", a[i]);?? //hi ing (a)


??? memcpy(a, b, 30)
;???????? //a[30] = "hi\0zengxiaolong"
??? printf("\nmemcpy():");
??? for(i = 0; i < 30; i++)
??????? printf("%c", a[i]);?? //hi zengxiaolong
??? printf("\n i = %d\n", i); //30

}
----------------------------------------

memcpy和memmove區別

memcpy與memmove的目的都是將N個字節的源內存地址的內容拷貝到目標內存地址中。

但當源內存和目標內存存在重疊時,memcpy會出現錯誤,而memmove能正確地實施拷貝,但這也增加了一點點開銷。

?

?memcpy實現

void* memcpy(void* dest, const void* src, size_t n) 
{char*      d = (char*) dest;const char*  s = (const char*) src;while(n-–) *d++ = *s++;return dest;
}


memmove實現

void* memmove(void* dest, const void* src, size_t n)
{char*     d  = (char*) dest;const char*  s = (const char*) src;if (s>d) {// start at beginning of swhile (n--)*d++ = *s++;}else if (s<d){// start at end of sd = d+n-1;s = s+n-1;while (n--)*d-- = *s--;}return dest;
}


?

總結

以上是生活随笔為你收集整理的strcpy,memcpy和memmove区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。