C語言memccpy()函數:復制內存中的內容
頭文件:
1
|
#include <string.h> |
定義函數:
1
|
void * memccpy( void *dest, const void * src, int c, size_t n); |
函數說明:memccpy()用來拷貝src 所指的內存內容前n 個字節到dest 所指的地址上。與memcpy()不同的是,memccpy()會在復制時檢查參數c 是否出現,若是則返回dest 中值為c 的下一個字節地址。
返回值:返回指向dest 中值為c 的下一個字節指針。返回值為0 表示在src 所指內存前n 個字節中沒有值為c的字節。
范例
1
2
3
4
5
6
7
|
#include <string.h> main(){ char a[] = "string[a]" ; char b[] = "string(b)" ; memccpy(a, b, 'B' , sizeof (b)); printf ( "memccpy():%s\n" , a); } |
執行結果:
1
|
memccpy():string(b) |
C語言memcpy()函數:復制內存內容(忽略\0)
頭文件:
1
|
#include <string.h> |
memcpy() 用來復制內存,其原型為:
1
|
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,使用時一般要進行強制類型轉換。
代碼示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#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; } |
運行結果:
1
2
|
p2 = abcde p3 = abcde |
代碼說明:
1) 代碼首先定義p1,p2,p3三個指針,但略有不同,p1指向一個字符串字面值,給p2分配了10個字節的內存空間。
2) 指針p3通過函數memcpy直接指向了指針p2所指向的內存,也就是說指針p2、p3指向了同一塊內存。然后打印p2,p3指向的內存值,結果是相同的。
3) 最后按照好的習慣釋放p2,并把p3也置為NULL是為了防止再次訪問p3指向的內存,導致野指針的發生。