memmove、memcpy和memccpy 簡介與思考

來源:互聯網
上載者:User

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。



求高手解答。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.