程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> memcpy函數語法 用法 例子

memcpy函數語法 用法 例子

編輯:關於C語言
 

該例子說明幾個問題

    1. mem開頭的函數基本上都是對內存操作的,     它們不管內存裡放的是什麼數據,只要給出長度,它們就操作。     不像strcpy、strcmp等函數一定以'\0'結尾,而且是字符。     mem可以操作可見字符、不可見字符、控制字符等,任意數據都可以。     2. memcpy是內存復制函數       原型:          void * memcpy(void *dest, void const *src, unsigned int length);        功能:從src的起始位置復制length個字節到dst的內存起始位置。你可以用這種             方法復制任何類型的值,第3個參數指定復制值的長度(以字節計)。             如果src和dst以任何形式出現了重疊,它的結果是未定義的。     3. memset函數       原型:void * memset(void *a, int val, unsigned int length);       功能:把從a開始的length個字節都設置為值val。       例子:memset(buffer, 0, SIZE);
  測試環境vc6.0 ********************************************************************/
#include <stdio.h>#include <string.h>    // 包含memcpy函數
 #define SIZE     10
 int main(void){/*   int i = 0;  char a[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};  char b[5];
   memcpy(b, a, 10);
   for (i = 0; i < 5; i++)  {    printf("b[%d] = %d\n", i, b[i]);  }
   //printf("b[5] = %d\n", b[5]);    // 引用超過數組下標的元素,編譯不會報錯,但邏輯上就錯了。*/
 /*  int i;  int a[5] = {1, 2, 3, 4, 5};  int b[10];
   memcpy(b, a, sizeof(int) * 5);
   for (i = 0; i < 10; i++)  {    printf("b[%d] = %d\n", i, b[i]);  }*/
 /*  // 數組src和dst都是char類型,從數組src復制SIZE個字節到數組dst.  // 但是,兩個數組都是整型數組該怎麼辦?參見下面的例子。  int i;  char src[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10};  char dst[SIZE];    memcpy(dst, src, SIZE);    for (i = 0; i < SIZE; i++)    printf("%-5d ", dst[i]);      printf("\n");*/
 /*  // 數組src和dst都是int類型,將數組src內容復制到dst數組。  // 前兩個參數並不需要使用強制類型轉換,因為在函數的原型中,參數的類型是 void *型指針,  // 而任何類型的指針都可以轉換為void *型指針。  int i;  int src[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10};  int dst[SIZE];    memcpy(dst, src, sizeof(int) * SIZE);  //memcpy(src,dst, sizeof(dst));    for (i = 0; i < SIZE; i++)    printf("%-5d ", dst[i]);      printf("\n");*/ 
 
   // 如果數組只有部分內容需要被復制,那麼需要復制的數量必須在第3個參數中指明。  // 對於長度大於一個字節的數據,要確保把數量和數據類型的長度相乘。  int i;  int src[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10};  int dst[SIZE];    memcpy(dst, src, sizeof(int) * 3);    for (i = 0; i < SIZE; i++)    printf("%-5d ", dst[i]);      printf("\n");   return 0;}
/******************************************************************** b[0] = 0 b[1] = 1 b[2] = 2 b[3] = 3 b[4] = 4 Press any key to continue
 
  b[0] = 1 b[1] = 2 b[2] = 3 b[3] = 4 b[4] = 5 b[5] = -858993460 b[6] = -858993460 b[7] = -858993460 b[8] = -858993460 b[9] = -858993460(隨機數) Press any key to continue
 
  1     2     3     4     5     6     7     8     9     10 Press any key to continue
 
  1     2     3     4     5     6     7     8     9     10 Press any key to continue
 
  1     2     3     -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460(隨機數) Press any key to continue 注意:這個語句有些編譯器在編譯時給警告,編譯可以通過。       執行時可能程序崩潰,因為內存訪問非法,因為b定義時長度就5,       這裡復制了長度為10,超出了b的長度,但memcpy會照樣復制過去,       這時系統的安全機制就會觸發,產生一個內存訪問中斷。程序就掛了。  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved