目錄
一:memcpy的使?
memcpy的使?的代碼
二:memcpy函數的模擬實現:
memcpy和strcpy的區別
用途:
安全性:
數據類型:
性能:
在字符串中的用法示例:
memcpy:
strcpy
一:memcpy的使?
這是memcpy在庫里的定義,具體可在cplusplus.com查看
void * memcpy ( void * destination, const void * source, size_t num )
?num單位是字節,下面的模擬實現需要強制類型轉換
?函數memcpy從source的位置開始向后復制num個字節的數據到destination指向的內存位置。
? 這個函數在遇到 '\0' 的時候并不會停下來。
? 如果source和destination有任何的重疊,復制的結果都是未定義的。對于重疊的內存,交給memmove來處理。(下期會有)
memcpy的使?的代碼
#include <stdio.h>
#include <string.h>
int main()
{ int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; memcpy(arr2, arr1, 20); int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr2[i]);//結果是1 2 3 4 5 6 7 8 9 10 } return 0;
}
二:memcpy函數的模擬實現:
(模擬實現)就要嚴格按照庫里所規定的
void和void*的用法已經發布
#include<stdio.h>
#include<assert.h>
void * my_memcpy ( void * dst, const void * src, size_t count)
{ void * ret = dst; assert(dst); assert(src); while (count--) { *(char *)dst = *(char *)src;//強制類型轉換 dst = (char *)dst + 1;//強制類型轉換 src = (char *)src + 1;//強制類型轉換 }return(ret);
}int main()
{ int arr1[]={1,2,3,4,5,6,7};int arr2[10]={0};void*p=my_memcpy(arr2,arr1,20);for(int i=0;i<10;i++){printf("%d ",*((int*)p+i));//強制類型轉換}return 0;}
memcpy和strcpy的區別
C語言中memcpy和strcpy是兩個常用的字符串和內存操作函數,但它們在用途和行為上有明顯的區別。
memcpy和strcpy都可以用在字符串,memcpy和strncpy在字符串中的使用幾乎完全等價。
用途:
memcpy:是一個通用的內存復制函數,它用于從源地址(source)開始拷貝n個字節到目標地址(destination)。源地址和目標地址可以是任何類型的內存區域,但必須確保目標內存區域有足夠的空間來容納源內存區域的內容。
strcpy:是一個專門用于復制字符串的函數,它從源字符串(source string)的起始位置開始,逐個字符地復制到目標字符串(destination string)中,直到遇到源字符串中的空字符(null character, '\0')為止。這意味著strcpy會自動處理字符串的終止符。
安全性:
memcpy:不檢查目標內存區域是否足夠大以容納源內存區域的內容。如果目標內存區域小于源內存區域,那么memcpy將會導致緩沖區溢出(buffer overflow),這是一個嚴重的安全漏洞,可能導致程序崩潰或被惡意利用。
strcpy:同樣存在緩沖區溢出的風險,尤其是當目標字符串數組的大小不足以容納源字符串(包括終止符)時。然而,由于strcpy是專門為字符串設計的,所以它在某些情況下可能更容易被識別和避免這種風險(例如,使用更安全的替代品如strncpy)。
數據類型:
memcpy:可以復制任何類型的內存區域,包括字符串、整數、浮點數等。它只關心字節的數量和起始地址。
strcpy:只能用于復制字符串,即字符數組。
性能:
在大多數情況下,由于memcpy不需要檢查空字符,所以它可能比strcpy稍微快一些。然而,這種差異通常很小,而且在許多現代編譯器和優化器的優化下可能變得不明顯。
在字符串中的用法示例:
memcpy:
#include<stdio.h>
#include<string.h>
int main()
{char arr3[]="abcdef";char arr4[20];memcpy(arr4,arr3,4);printf("%s\n",arr4);//結果:abcd
}
strcpy:
#include<stdio.h>
int main()
{char arr5[]="abcdef";char arr6[20];strncpy(arr6,arr5,4);//strcpy(arr6,arr5);,不可以確切的復制字符串,只能全部復制進去printf("%s\n",arr6);//結果也是abcd}
注意:在使用memcpy和strcpy時,都應該確保目標內存區域有足夠的空間來容納源內存區域的內容,以避免緩沖區溢出。在實際編程中,更推薦使用更安全的替代品,如strncpy和strncpy_s(如果編譯器支持)。