————————————————分割線————————————————
分割線以內的博客轉載自:https://blog.csdn.net/qq_38993096/article/details/88377285,侵刪
C語言:#include<string.h>
C++:#include
void *memcpy(void *dest, const void *src, size_t n);
從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中,是用指針進行操作的。
注意:
1.strcpy提供了字符串的復制。即strcpy只用於字符串復制,並且它不僅復制字符串內容之外,還會復制字符串的結束符。
2.memcpy提供了一般內存的復制。即memcpy對於需要復制的內容沒有限制,因此用途更廣。
strcpy和memcpy主要有以下3方面的區別:
1、復制的內容不同。strcpy只能復制字符串,而memcpy可以復制任意內容,例如字符數組、整型、結構體、類等。
2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。
3、用途不同。通常在復制字符串時用strcpy,而需要復制其他類型數據時則一般用memcpy
————————————————
版權聲明:本文為CSDN博主「fjghgsrfdhbrs」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38993096/java/article/details/88377285
memcpy(d,s+12,4);//從第13個字符(V)開始復制,連續復制4個字符(View)到s d[4]='\0';//必須有這句,不然字符串會亂碼 //memcpy(d,s+12*sizeof(char),4*sizeof(char));也可
函數源碼:
void *memcpy(void *dest, const void *src, int count) { void *ptr = dest; if (NULL == dest || NULL == src || count <= 0) { return NULL; } while (count--) *(char *)dest++ = *(char *)src++; return ptr; }
————————————————分割線————————————————
補充整型數組復制相關:
整型數組復制的時候,第三個參數應該為sizeof(int) * size (同理會有sizeof(long int) * size, sizeof(Node) * size...)
在memcpy的源碼中可以看到,復制是以char為地址單元進行的,所以第三個參數只傳進size的話,那么將會只復制前size個char地址單元的數據。
int main() { int a[4] = {1, 2, 3, 100}; int b[3] = {4, 5, 6}; memcpy(b, a, 4); // 通常int = 4 * char, 所以復制的結果為b = {1, 5, 6}, 只復制了前4個char地址的內容 memcpy(b, a, sizeof(int) * 3); // 這里的sizeof(int) * 3 == 12, 所以復制結果為b = {1, 2, 3}; for (int i = 0; i < 3; i++) { printf("%d ", b[i]); } return 0; }