memmove、memcpy和memccpy三個函數(shù)都是內(nèi)存的拷貝,從一個緩沖區(qū)拷貝到另一個緩沖區(qū)。
memmove(void *dest,void*src,int count)
memcpy(void *dest,void *src,int count)
memccpy(void*dest,void*src,int ch,int count)
表頭文件: #include <string.h>
定義函數(shù): void *memcpy(void *dest, const void *src, size_t n)
函數(shù)說明: memcpy()用來拷貝src所指的內(nèi)存內(nèi)容前n個字節(jié)到dest所指的內(nèi)存地址上。與strcpy()不同的是,memcpy()會完整的復制n個字節(jié),不會因為遇到字符串結(jié)束'\0'而結(jié)束
返回值: 返回指向dest的指針
表頭文件: #include <string.h>
定義函數(shù): void *memccpy(void *dest, const void *src, int c, size_t n);
函數(shù)說明: memccpy()用來拷貝src所指的內(nèi)存內(nèi)容前n個字節(jié)到dest所指的地址上。與memcpy()不同的是,memccpy()如果在src中遇到某個特定值(int c)立即停止復制。
返回值: 返回指向dest中值為c的下一個字節(jié)指針。返回值為0表示在src所指內(nèi)存前n個字節(jié)中沒有值為c的字節(jié)。
表頭文件: #include <string.h>
定義函數(shù): void *memmove(void *dest, const void *src, size_t n);
函數(shù)說明:memmove()是從一個緩沖區(qū)移動到另一個緩沖區(qū)中。
返回值: 返回指向dest指針。
當dest <= src-count 或dest >= src+count時,以上三個函數(shù)均不會產(chǎn)生覆蓋問題,即源數(shù)據(jù)不會被更改。
若不在以上范圍內(nèi),則源數(shù)據(jù)會被更改。如:char a[]={'a','b'};char b[]={'c','d','e','f','g','h'};memmove(a,b,sizeof(b));或是直接char *p=b+2;memmove(p,b,sizeof(b));輸出數(shù)據(jù)會發(fā)現(xiàn)b中數(shù)據(jù)輸出已被更改。發(fā)現(xiàn)即使a數(shù)組指向的空間不夠存儲數(shù)據(jù),也能夠移動成功。原因|dest - src |<count如果在使用這些函數(shù)時,分配給足夠的空間,然后再使用就不會出現(xiàn)覆蓋問題。也就是說如果外部分配給的空間不足以存儲要拷貝的數(shù)據(jù)時,就有可能出現(xiàn)源數(shù)據(jù)被覆蓋更改的問題。#include <stdio.h>#include <stdlib.h>#include <string.h>void main(void){ int i=0; char a[9]={'a','b','c','d','e','f','g','h','\0'}; char p[2]={'q','w'};//或char *p=a+2; memmove(p,a,sizeof(a)); puts(a); printf("_____________________________________________\n"); puts(p); printf("_____________________________________________\n"); for(i =0;i<10;i++) printf("%c %d \n",*(a+i),a+i); printf("_____________________________________________\n"); for(i =0;i<8;i++) printf("%c %d \n",*(p+i),p+i); }觀察輸出結(jié)果。把memmove(p,a,sizeof(a));改為memcpy(p,a,sizeof(a));或memccpy(p,a,'e',sizeof(a));再觀察輸出結(jié)果。可以看出在目的存儲空間不足時,便會出現(xiàn)源數(shù)據(jù)被覆蓋改變的問題。如果目的存儲空間分配足夠的空間,則便不會出現(xiàn)覆蓋問題。本文轉(zhuǎn)自:http://www.shnenglu.com/kang/archive/2009/04/05/78984.html
posted on 2012-09-11 10:28
王海光 閱讀(552)
評論(0) 編輯 收藏 引用 所屬分類:
C++