天天看點

memset與memcpy函數總結

memset函數詳細說明;void *memset(void *str, int c, size_t n);

該函數功能:将str 指向的某一塊記憶體中的每個位元組的内容全部設定為c 指定的ASCII值,塊的大小由第三個參數n 指定,該函數通常為新申請的記憶體做初始化工作。

該函數作用:為已開辟記憶體空間str 的前n 個位元組的值設為值c (給申請的空間初始化)。

該函數包含在string.h頭檔案(C language),cstring或string.h(C++ language).

memset函數執行個體:

void fmemset()  {

    char strbuf[] = "與冰雪博弈,同時間賽跑!\n";

    printf("fmemset strbuf: %s\n",strbuf);

    memset(strbuf,'*',sizeof(strbuf));

    //printf("fmemset memset( ,'*' , )after strbuf:%s\n",strbuf);

    memset(strbuf, 0, sizeof(strbuf));

    printf("fmemset memset( ,0, ) after strbuf:%s\n", strbuf);

}

注意:在使用memset函數時,不可将char* str 字元串類型的變量初始化,因為字元串資料内容儲存于隻讀存儲區,其内容不能被随意更改。

memcpy函數詳細說明:void *memcpy(void *strbuf,const void *str,size_t n);

該函數功能:将str 位址處的内容拷貝n個位元組的資料至目标位址strbuf指向的記憶體中,函數傳回指向strbuf的指針。

該函數作用:将str中的内容拷貝至strbuf中。

memcpy函數執行個體:

void fmemcpy()  {

    char* str = "有朋自遠方來,不亦樂乎!";

    char strbuf[30];

    memset(strbuf, 0, sizeof(strbuf));

    memcpy(strbuf, str, sizeof(strbuf));

    printf("fmemcpy memcpy( , , ) after strbuf:%s\n",strbuf);

}

注意:char a[20],b[10]; memcpy(b,a,sizeof(b));如果函數memcpy的第三個參數使用sizeof(a),則會造成b的記憶體溢出。[VS2013 報錯:Run-Time Check Failure #2 - Stack around the variable 'b' was corrupted.]

與memcpy函數類似的strcpy函數:memcpy函數是記憶體拷貝,可以使用該函數拷貝任何資料類型的對象,并可以指定拷貝的資料長度;strcpy函數隻能拷貝字元串,該函數至“\n”就結束拷貝,例如:char a[20],b[10];strcpy(b,a);該函數執行時,要注意a中字元的長度(第一個'\0'之前)是否超過10位,如果超過則會造成b 的記憶體溢出,[緩沖區溢出,(輕)程式崩潰,(重)系統癱瘓;VS2013 報錯:Run-Time Check Failure #2 - Stack around the variable 'b' was corrupted.]。

c++

繼續閱讀