memmove、memcpy和memccpy 三個函數都是記憶體的拷貝,從一個緩衝區拷貝到另一個緩衝區。
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>
定義函數: void *memcpy(void *dest, const void *src, size_t n)
函數說明: memcpy()用來拷貝src所指的記憶體內容前n個位元組到dest所指的記憶體位址上。與strcpy()不同的是,memcpy()會完整的複製n個位元組,不會因為遇到字串結束'\0'而結束
傳回值: 返回指向dest的指標
表標頭檔: #include <string.h>
定義函數: void *memccpy(void *dest, const void *src, int c, size_t n);
函數說明: memccpy()用來拷貝src所指的記憶體內容前n個位元組到dest所指的地址上。與memcpy()不同的是,memccpy()如果在src中遇到某個特定值(int c)立即停止複製。
傳回值: 返回指向源中值為c的下一個位元組指標。傳回值為0表示在src所指記憶體前n個位元組中沒有值為c的位元組。
表標頭檔: #include <string.h>
定義函數: void *memmove(void *dest, const void *src, size_t n);
函數說明:memmove()是從一個緩衝區移動到另一個緩衝區中。
傳回值: 返回指向dest指標。
當dest <= src-count 或dest >= src+count時,以上三個函數均不會產生覆蓋問題,即來源資料不會被更改。
若不在以上範圍內,則來源資料會被更改。
如:
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));
輸出資料會發現b中資料輸出已被更改。
發現即使a數組指向的空間不夠儲存資料,也能夠移動成功。
原因|dest - src |<count
如果在使用這些函數時,分配給足夠的空間,然後再使用就不會出現覆蓋問題。也就是說如果外部分配給的空間不足以儲存要拷貝的資料時,就有可能出現來源資料被覆蓋更改的問題。
#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);
}
觀察輸出結果。
把memmove(p,a,sizeof(a));改為memcpy(p,a,sizeof(a));或memccpy(p,a,'e',sizeof(a));再觀察輸出結果。
可以看出在目的儲存空間不足時,便會出現來源資料被覆蓋改變的問題。
如果目的儲存空間分配足夠的空間,則便不會出現覆蓋問題。
程式運行結果:
本部落格轉載自 http://www.cppblog.com/kang/archive/2009/04/05/78984.html,考驗C/C++基本功。
有個問題,在上面的程式中,變數a的地址和變數p的地址在記憶體配置時他們的關係,a在高地址,p在低地址還是a在低地址,p在高地址空間呢?
這裡表現是分配給P的地址要低於分配給A變數的地址,也就是說變數P空間後面緊接著是變數A的空間,測試平台 X86,Ubuntu12.04,GCC/G++ ,讓同事在VS2005 WindowXP下面也嘗試了一下變數的分配,後分配的變數地址要低於先分配的變數地址。
這種函數內局部變數佔用空間地址分配情況是不是跟編譯器的設定有關係呢?希望高手解答,指導。
另外測試:
char a[]={'a','b'};
char b[]={'c','d','e','f'};
memmove(a,b,sizeof(b));
puts(a);
puts (" ");
puts(b);
printf("a address is %u\n",a);
printf("b address is %u \n",b);
確實發生了源地址資料的覆蓋,變數b的地址大於變數a。
求高手解答。