memset函數(shù)


memset是計(jì)算機(jī)中C/C++語言函數(shù)。
void **memset(void *s, int ch, size_t n);
函數(shù)解釋:將s中當(dāng)前位置后面的n個(gè)字節(jié) (typedef unsigned int size_t )用 ch 替換并返回 s 。
作用:在一段內(nèi)存塊中填充某個(gè)給定的值,它是對(duì)較大的結(jié)構(gòu)體數(shù)組進(jìn)行清零操作的一種最快方法。


簡(jiǎn)單示例1:
如下demo是可以的,能把數(shù)組中的元素值都設(shè)置成字符1

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char a[5];
    memset(a,'1',5);
    for(int i=0;i<5;i++)
        cout<<a[i]<<"";
    system("pause");
    return 0;
}

而,如下程序想把數(shù)組中的元素值設(shè)置成1,卻是不可行的

#include <iostream>
#include <cstring>
#include <windows.h>
using namespace std;
int main()
{
    int a[5];
    memset(a,1,20);
 
   
                    //也等價(jià)于memset(a,1,sizeof(a));.
    for(int i=0;i<5;i++)
        cout<<a[i]<<"";
    system("pause");
    return 0;
}

問題是:
1.第一個(gè)程序?yàn)槭裁纯梢?,而第二個(gè)不行?
因?yàn)榈谝粋€(gè)程序的數(shù)組a是字符型的,字符型占據(jù)內(nèi)存大小是1Byte,而memset函數(shù)也是以字節(jié)為單位進(jìn)行賦值的,所以你輸出沒有問題。而第二個(gè)程序a是整型的,使用 memset還是按字節(jié)賦值,這樣賦值完以后,每個(gè)數(shù)組元素的值實(shí)際上是0x01010101即十進(jìn)制的16843009。
如果用memset(a,1,20),就是對(duì)a指向的內(nèi)存的20個(gè)字節(jié)進(jìn)行賦值,每個(gè)都用數(shù)1去填充,轉(zhuǎn)為二進(jìn)制后,1就是00000001,占一個(gè)字節(jié)。一個(gè)int元素是4字節(jié),合一起是0000 0001,0000 0001,0000 0001,0000 0001,轉(zhuǎn)化成十六進(jìn)制就是0x01010101,就等于16843009,就完成了對(duì)一個(gè)int元素的賦值了。

簡(jiǎn)單示例2:

#include <string.h>
#include <stdio.h>
#include <memory.h>
 
int main(void)
{
    char buffer[]="Helloworld\n";
    printf("Buffer before memset:%s\n",buffer);
    memset(buffer,'*',strlen(buffer));
    printf("Buffer after memset:%s\n",buffer);
    return 0;
}

輸出結(jié)果:
Buffer before memset:Helloworld
Buffer after memset:***********
(總結(jié)來源百度百科)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容