標頭檔案:cstring或memory
話說剛開始使用memset的時候一直以為memset是對每乙個int賦值的,心裡想有了memset還要for迴圈對陣列進行初始化幹嘛。但其實memset這個函式的作用是將數字以單個位元組逐個拷貝的方式放到指定的記憶體中去。
比如
memset(dp,0,sizeof(dp));
int型別的變數一般占用4個位元組,對每乙個位元組賦值0的話就變成了「00000000 00000000 000000000 00000000」 (即10進製數中的0)
賦值為-1的話,放的是 「11111111 11111111 11111111 11111111 」(十進位制的-1)
這樣你可能以為如果你賦值1的話會讓整個dp陣列裡的每乙個int變成1,其實不然。
memset(dp,1,sizeof(dp));
以上**執行後,dp陣列的內容為 00000001 00000001 00000001 00000001 轉化為十進位制後不為1
我們在很多程式中都會看到memset(a,127,sizeof(a));這樣的**,127是什麼特別的數字呢?通過基礎的進製轉換可以得知127的二進位制表示是01111111,那麼在dp陣列裡放的內容就是「01111111 01111111 01111111 01111111」,(10進製的2139062143),這樣就實現了將陣列裡的全部元素初始化為乙個很大的數的目的了,在最短路徑問題以及其他很多演算法中都是需要用到的。值得注意的是,int型別的範圍為2^31-1,大約是2147483647的樣子(如果我沒有記錯的話),所以初始化int型別的陣列也可以使用127這個數值。
如果是128呢?因為128的二進位制是10000000,那麼放的內容就是10000000 10000000 10000000 10000000,經過計算可得這個數是-2139062144。這樣就可以將陣列初始化為乙個很小的數了。
memset函式用法及注意事項
memset 函式是記憶體賦值函式,用來給某一塊記憶體空間進行賦值的。其原型是 void memset void dst,int val,size t size 使用時在檔案頭加上 include stdlib.h dst是目標起始位址,val是要賦的值,size是要賦值的位元組數 例1 char ...
C 使用memset注意事項
include void memset void dest,int ch,std size t count 它會 轉換值 ch 為 unsigned char 並複製它到 dest 所指向物件的首 count 個位元組。因此memset方法會破壞物件內部保持狀態的私有變數,從而造成未知後果。下例對s...
memset函式注意事項
memset 函式是記憶體賦值函式,用來給某一塊記憶體空間進行賦值的。其原型是 void memset void dst,int val,size t size 使用時在檔案頭加上 include stdlib.h dst是目標起始位址,val是要賦的值,size是要賦值的位元組數。例1 char ...