功能
memcpy指的是c和c++使用的內存拷貝函數,memcpy函數的功能是從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中
頭文件
所在頭文件 <string.h>或< cstring >
函數原型
_CRTIMP int __cdecl __MINGW_NOTHROW memcmp (const void*, const void*, size_t) __MINGW_ATTRIB_PURE;
參數含義:
- 第一個參數:目的地址
- 第二個參數:源地址
- 第三個參數:所需要復制的字節數
程序用例
- 目的地址與原地址數據寬度相同的時候
1 int main() 2 { 3 char a[4] = "mmmm"; 4 char b[7] = "123455"; 5 memcpy(b,a,3); 6 printf("%d\n\r",sizeof(b)); 7 printf("%s\n",b); 8 for(int i = 0; i < sizeof(b); i++) 9 printf("b[%d]的字符串是%c\n\r",i,b[i]); 10 return 0; 11 }
運行結果
可以看出memcpy函數只復制需要size_t個字節數據到目的地址,目的地址size_t之后的數據並不會改變
- 目的地址的寬度比原地址不相等時
1 int main() 2 { 3 char a[8] = "abcdef"; 4 short b[4] = {0x17,0x18,0x19,0x19}; 5 //目的地址數據寬
6 memcpy(b,a,6); 7 printf("b[0]的值是%c\n",b[0]); 8 printf("b[0]的值是%c\n",b[0]>>8); 9 printf("b[1]的值是%x\n",b[1]); 10 printf("b[2]的值是%x\n",b[2]); 11 printf("b[3]的值是%x\n",b[3]); 12 return 0; 13 }
運行結果
可以看到原始數據先復制到低位,再復制到高位,感覺這個可能跟數據的存儲大端小端有關系,在CCS上測試了也是這樣的效果。
- 目的地址的寬度比原地址的寬度小
1 int main() 2 { 3 //源地址數據寬
4 short c[5] = {0x1234,0x5678,0x2345,0x3390}; 5 char d[10] = {0}; 6 memcpy(d,c,6); 7 for(int i = 0; i < sizeof(d); i++) 8 printf("d[%d]的值是%x\n\r",i,d[i]); 9 return 0; 10 }
運行結果
先復制的是低位,再復制的是高位。
-復制之后再還原
1 int main() 2 { 3 char a[8] = "abcdef"; 4 short b[4] = {0x17,0x18,0x19,0x19}; 5 memcpy(b,a,6); 6 char d[10] = {0}; 7 memcpy(d,b,6); 8 for(int i = 0; i < sizeof(d); i++) 9 printf("d[%d]的值是%x\n\r",i,d[i]); 10 return 0; 11 }
運行結果