頭檔案:#include <string.h>
memcpy() 用來複制記憶體,其原型為:
void * memcpy ( void * dest, const void * src, size_t num );
memcpy() 會複制 src 所指的記憶體内容的前 num 個位元組到 dest 所指的記憶體位址上。
memcpy() 并不關心被複制的資料類型,隻是逐位元組地進行複制,這給函數的使用帶來了很大的靈活性,可以面向任何資料類型進行複制。
需要注意的是:
dest 指針要配置設定足夠的空間,也即大于等于 num 位元組的空間。如果沒有配置設定空間,會出現斷錯誤。
dest 和 src 所指的記憶體空間不能重疊(如果發生了重疊,使用 memmove() 會更加安全)。
與 strcpy() 不同的是,memcpy()
會完整的複制 num 個位元組,不會因為遇到“\0”而結束。
【傳回值】傳回指向 dest 的指針。注意傳回的指針類型是 void,使用時一般要進行強制類型轉換。
代碼示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n (10)
int main()
{
char* p1 = "abcde";
char* p2 = (char*)malloc(sizeof(char) * n);
char* p3 = (char*)memcpy(p2, p1, n);
printf("p2 = %s\np3 = %s\n", p2, p3);
free(p2);
p2 = null;
p3 = null;
system("pause");
return 0;
}
運作結果:
p2 = abcde
p3 = abcde
代碼說明:
1) 代碼首先定義p1,p2,p3三個指針,但略有不同,p1指向一個字元串字面值,給p2配置設定了10個位元組的記憶體空間。
2) 指針p3通過函數memcpy直接指向了指針p2所指向的記憶體,也就是說指針p2、p3指向了同一塊記憶體。然後列印p2,p3指向的記憶體值,結果是相同的。
3) 最後按照好的習慣釋放p2,并把p3也置為null是為了防止再次通路p3指向的記憶體,導緻野指針的發生。