1.對於陣列初始化為0操作,常用:
memset(a,0,sizeof a);
替代迴圈: for(i=0;i2.將陣列初始化為無窮大的情況,例如floyd演算法。
通常對於 32位int有符號數,我們將 無窮大inf 設為 0x3f3f3f3f ,
#define inf 0x3f3f3f3f
為什麼不設 inf 為最大值 0x7fffffff (32位int有符號數)呢?
原因是對於部分問題可能出現 無窮大 加 無窮大 的情況,這樣就會出現溢位錯誤。
所以至多應選擇 0x7fffffff 的一半 0x3fffffff,
而 0x3fffffff 和 0x3f3f3f3f 在數量級上是差不多,
都足夠大,但將inf設為 0x3f3f3f3f 就可以用 memset 來初始化。
memset(a,0x3f,sizeof a);
memset 是按位元組進行賦值,能將陣列整個初始化為 3f3f3f3f3f3f3f3f3f3f3f3f3f… ,也就是無窮大了
這樣像用floyd解決的問題,就不必先跑一邊o(n^2)去初始化陣列。
3.類似的,需將陣列初始化為-1時,可以用:
memset(a,0xff,sizeof a);
這種情況也很常見。
初學時,很多猿不理解為什麼memset只對初始化 0 和 -1 時有效。
memset(a,0,sizeof a);
memset(a,-1,sizeof a);
因為 memset 是按位元組賦值,即使給它int型別數,它也是只取該數最低位的乙個位元組來賦值。
所以 memset 傳int型引數來初始化只適用於各個位元組都相同的數,這樣才能表現出期望的效果,
就像 0x3f3f3f3f 0xffffffff 0x00000000 這種。
以上初始化操作對於 64位 long long 有符號數 同樣適用。
#define ll_inf 0x3f3f3f3f3f3f3f3f
**:
c 語言中memset函式
memset函式作用 初始化,將指標所指向的一大塊連續記憶體設定成乙個指定的數值。一般使用情景 定義了乙個變數後,將其初始化。可以對陣列 結構 等初始化,比for方便快捷。struct sigaction sa memset sa,0,sizeof struct sigaction 該函式語法 vo...
C語言中memset函式詳解
功 能 將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作 用 法 void memset void s,char ch,unsigned n 程式例 include include include int...
C語言中memset函式詳解
功 能 將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作 用 法 void memset void s,char ch,unsigned n 程式例 include include include int...