該例子說明幾個問題
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);#include <stdio.h>#include <string.h> // 包含memcpy函數/******************************************************************** b[0] = 0 b[1] = 1 b[2] = 2 b[3] = 3 b[4] = 4 Press any key to continue
#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;}