天天看點

C函數之memcpy()函數用法

頭檔案:#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指向的記憶體,導緻野指針的發生。

繼續閱讀