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