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
記憶體初始化 memset函式的使用
前段專案中發現乙個問題,程式總是在某個dynamic cast進行動態轉換時出異常,查了半天才發現問題原來是出在memset的使用上,雖然問題本身顯而易見,但當處於幾十萬行 量級中時,就變得不太那麼容易定位了。本文歸納了下使用memset幾個需要注意的地方,雖然內容很簡單,但也希望對大家有所幫助。1...
memset和fill的初始化問題
對於memset是按照1位元組為單位對記憶體進行填充。對於int型 可以對 1和0進行初始化 若對無窮大用memset初始化,必須是0x3f3f3f3f 不能是99999這樣的無窮大。且型別必須是int型,不能是別的型別。fill也能進行初始化,原型是 fill vector.begin vecto...
關於memset初始化結構被濫用的問題
參見函式 bool cpageformctrl loadtheme m ppagedata new pagedata m nnumofpages memset m ppagedata,0,m nnumofpages sizeof pagedata 注意 由於 pagedata 使用了std vect...