C語(yǔ)言memset函數(shù)詳解
在c語(yǔ)言中,使用變量前,需要先對(duì)變量的值進(jìn)行初始化。數(shù)組在內(nèi)存中占用一片連續(xù)的存儲(chǔ)塊。而c語(yǔ)言提供了memset函數(shù)(頭文件string.h)對(duì)數(shù)組進(jìn)行組團(tuán)賦值。(memset函數(shù)也能對(duì)變量賦值,但只有無(wú)聊的人才會(huì)這么做。詳見(jiàn)下文目錄五)
一、memset函數(shù)原型:
void memset ( void *s , char ch, unsigned n )
函數(shù)功能:將s為首地址的一片連續(xù)的n個(gè)字節(jié)內(nèi)存單元都賦值為ch
二、使用memset函數(shù)
# include <stdio.h> # include <string.h> int main() { char c[10]; // 把數(shù)組c的10個(gè)元素都賦值為'a' memset(c, 'a', 10); for (int i=0; i<10; i++) { printf("%c\t", c[i]); } return 0; }
輸出:
a a a a a a a a a a
# include <stdio.h> # include <string.h> int main() { int a[10]; memset(a, 0, 10*sizeof(int)); /* 數(shù)組a是int類型的,一個(gè)int占4個(gè)字節(jié),所以a[10]實(shí)際上有40個(gè)字節(jié)。 而char類型只占1個(gè)字節(jié),所以不需要乘sizeof(char) */ // 輸出數(shù)組a和b for (int i=0; i<10; i++) { printf("%d\t", a[i]); } printf("\n"); return 0; }
輸出:
0 0 0 0 0 0 0 0 0 0
emset函數(shù)是對(duì)n個(gè)字節(jié)進(jìn)行賦值。而char類型占1個(gè)字節(jié)。但是int類型占4個(gè)字節(jié),所以對(duì)int、short等類型賦值時(shí),需要乘上字節(jié)數(shù)。
三、給int類型賦值為1
# include <stdio.h> # include <string.h> int main() { int a[10]; memset(a, 1, 10*sizeof(int)); // 輸出數(shù)組a for (int i=0; i<10; i++) { printf("%d\t", a[i]); } return 0; }
輸出:
16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009
輸出結(jié)果可以看到,并沒(méi)有給數(shù)組元素賦值為1。為什么呢?這是為什么呢?
前面我們說(shuō)過(guò),memset是對(duì)連續(xù)的n個(gè)字節(jié)進(jìn)行賦值。但是int類型占4個(gè)字節(jié)。memset賦值時(shí),直接將數(shù)組拆成40個(gè)字節(jié)賦值,并沒(méi)有把4個(gè)字節(jié)看成一個(gè)整體
四、扒開內(nèi)存
我們定義一個(gè)數(shù)組; int a[2]; memset(a, 1, 2*sizeof(int)); 假設(shè)內(nèi)存中每個(gè)位都是0,定義數(shù)組,以a為首地址的內(nèi)存各個(gè)位: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 使用memset函數(shù),對(duì)每個(gè)字節(jié)賦值為1。一個(gè)字節(jié)為8位,所以,數(shù)組變?yōu)? 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 注意,賦值數(shù)組時(shí),一個(gè)int被拆成了4個(gè)單獨(dú)的字節(jié) 而0000 0001 0000 0001 0000 0001 0000 0001的10進(jìn)制剛好為 16,843,009
五、memset給變量賦值
memset函數(shù)第一個(gè)參數(shù)是指針類型,也就是說(shuō),只要我們給他一個(gè)地址就行了
# include <stdio.h> # include <string.h> int main() { char a; memset(&a, 'c', 1); printf("%c\n", a); return 0; }
輸出:
c
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
設(shè)計(jì)模式中的備忘錄模式解析及相關(guān)C++實(shí)例應(yīng)用
這篇文章主要介紹了設(shè)計(jì)模式中的備忘錄模式解析及相關(guān)C++實(shí)例應(yīng)用,備忘錄模式也經(jīng)常被用來(lái)在命令模式中維護(hù)可以撤銷(Undo)操作的狀態(tài),需要的朋友可以參考下2016-03-03C++ 使用CRC32檢測(cè)內(nèi)存映像完整性的實(shí)現(xiàn)步驟
當(dāng)我們使用動(dòng)態(tài)補(bǔ)丁的時(shí)候,那么內(nèi)存中同樣不存在校驗(yàn)效果,也就無(wú)法抵御對(duì)方動(dòng)態(tài)修改機(jī)器碼了,為了防止解密者直接對(duì)內(nèi)存打補(bǔ)丁,我們需要在硬盤校驗(yàn)的基礎(chǔ)上,增加內(nèi)存校驗(yàn),防止動(dòng)態(tài)補(bǔ)丁的運(yùn)用。2021-06-06詳解C語(yǔ)言中strcpy()函數(shù)與strncpy()函數(shù)的使用
這篇文章主要介紹了詳解C語(yǔ)言中strcpy()函數(shù)與strncpy()函數(shù)的使用,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08C++輸出上三角/下三角/菱形/楊輝三角形(實(shí)現(xiàn)代碼)
本篇文章是對(duì)C++中輸出上三角/下三角/菱形/楊輝三角形的示例代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07