天天看點

memset函數與memcpy記憶體拷貝函數的改裝

memset函數作用:

初始化,将指針所指向的一大塊連續記憶體設定成一個指定的數值。

一般使用情景:定義了一個變量後,将其初始化。可以對數組、結構、等初始化,比for友善快捷。

struct sigaction sa;

memset(&sa,0,sizeof(struct sigaction));

1

2

該函數文法:

void * memset ( void * ptr, int value, size_t num );

ptr指的是指向記憶體塊的指針。value指的是記憶體塊被設定的數值的大小。size_t num指的是記憶體塊的大小。

頭檔案引用:

引用頭檔案:

#inlcude<string.h>

注意:

對數組a[]進行初始化時,表達式memset(a,0,size)中的size指的是數組所占記憶體的大小,而不是數組中元素的個數。

下面這個是錯誤的示例:

#include<string.h>

#include

using namespace std;

int main()

{

int a[]={1,2,3,4} ;

int n=sizeof(a)/sizeof(int );

//initial the array

memset(a,0,n);

//print the array

for(int i=0;i<n;i++)

cout<<a[i]<<" ";

1

}

錯誤示例的輸出:

0,2,3,4

它并沒有将所有的項都初始化,隻對第一個數進行了初始化。應為int類型所配置設定的空間是4位元組。

**

memcpy函數原型

**

void *memcpy(void *destin, void *source, unsigned n);

參數

destin-- 指向用于存儲複制内容的目标數組,類型強制轉換為 void* 指針。

source-- 指向要複制的資料源,類型強制轉換為 void* 指針。

n-- 要被複制的位元組數。

傳回值

該函數傳回一個指向目标存儲區destin的指針。

改裝:原來傳回指針指向destin[0],改成指向destin[n],而destin最後一個字元是destin[n-1]

#define ngx_cpymem(dst, src, n) (((u_char *) memcpy(dst, src, n)) + (n)) //注意#define寫法,n這裡用()包着,防止出現什麼錯誤

例如:

u_char  errstr[NGX_MAX_ERROR_STR+1];
		p = ngx_cpymem(errstr, "nginx: ", 7);     //p指	向"nginx: "之後    
           
c++

繼續閱讀