memset 初始化做題常用的3種情況

2021-09-13 08:56:32 字數 1428 閱讀 9865

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