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区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx源码分析--数据对齐posix
- 下一篇: 指针的本质2-void和void*及其应