今天做了一道素數打表的題我在使用乙個陣列記錄是否為素數的時候使用了memset,將陣列裡面的數都清為1,代表是素數,不是素數,就改成0,我在判斷這乙個數是否為素數是依據也是是0還是1,結果一直存在問題,經過我一步步的除錯竟然發現了乙個之前從未在意過的bug,memset只能將int型陣列清理成0或-1!!!
我們來驗證一下:
#include #includeintmain()
return0;
}
程式功能:初始化陣列元素為輸入值。
輸入:-1
預期輸出:
-1 -1
0 01 1
實際輸出:
-1 -1
0 016843009 16843009
原因:
memset是按位元組賦值的,取變數a的後8位二進位制進行賦值。
1的二進位制是(00000000 00000000 00000000 00000001),取後8位(00000001),int型佔4個位元組,當初始化為1時,它把乙個int的每個位元組都設定為1,也就是0x01010101,二進位制是00000001 00000001 00000001 00000001,十進位制就是16843009。
之所以輸入0,-1時正確,原理是這樣的。
0,二進位制是(00000000 00000000 00000000 00000000),取後8位(00000000),初始化後00000000 00000000 00000000 00000000結果是0
-1,負數在計算機中以補碼儲存,二進位制是(11111111 11111111 11111111 11111111),取後8位(11111111),則是11111111 11111111 11111111 11111111結果也是-1
這是c標準庫裡面的memset的原碼:
1void *(memset)(void *s, int
c, size_t n)
2
原始碼說明對於陣列引數是按照字元陣列的形式進行賦值的。
當初始化乙個位元組單位的陣列時,可以用memset把每個陣列單元初始化成任何你想要的值,比如,
1char data[10
];2 memset(data, 1, sizeof(data)); //
right
3 memset(data, 0, sizeof(data)); //
right
而想要將int型陣列賦值成自己想要的值,我只會自己diy了
1int a[11];2
for(int i=0; i3
正確使用memset
本文歸納了下使用memset幾個需要注意的地方,雖然內容很簡單,但也希望對大家有所幫助。1.memset是以位元組為單位,初始化記憶體塊。當初始化乙個位元組單位的陣列時,可以用memset把每個陣列單元初始化成任何你想要的值,比如,cpp view plain copy char data 10 m...
正確使用memset函式
本文歸納了下使用memset幾個需要注意的地方,雖然內容很簡單,但也希望對大家有所幫助。1.memset是以位元組為單位,初始化記憶體塊。當初始化乙個位元組單位的陣列時,可以用memset把每個陣列單元初始化成任何你想要的值,比如,cpp view plain copy print char dat...
老生常談,正確使用memset
前段專案中發現乙個問題,程式總是在某個dynamic cast進行動態轉換時出異常,查了半天才發現問題原來是出在memset的使用上,雖然問題本身顯而易見,但當處於幾十萬行 量級中時,就變得不太那麼容易定位了。本文歸納了下使用memset幾個需要注意的地方,雖然內容很簡單,但也希望對大家有所幫助。1...