關於C語言中的memset函式

2021-09-25 01:16:14 字數 1094 閱讀 9637

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...