[原]乙個由memset引發的知識點
在除錯乙個基數排序的問題時,我想對最開始分配的int*賦初值,類似於windows上的zeromemory,但是我發現事情沒有那麼簡單。
例子:#include
#include
using namespace std;
int main()
output:
0 -> 0 -> 1193541632 -> 1397052160 -> 1313818963 -> 1162690894 -> 1852785469 -> 1701605235 -> 1937330944 -> 1148020084 ->
1.memset(c, 0x0, 10);=> memset(c, 0x0, 10 * sizeof(int));
output:
0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 ->
2.memset(c, 0x0, 10); => memset(c, 0x1, 10);
output:
16843009 -> 16843009-> 1193541889 -> 1397052160 -> 1313818963 -> 1162690894 -> 1852785469 -> 1701605235 -> 1937330944 -> 1148020084 ->
3.memset(c, 0x0, 10); => memset(c, 0x1, 10 * sizeof(int));;
output:
16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 ->
原因(memset prototype:
_crtimp void* __cdecl __mingw_nothrow memset (void*, int, size_t);
memset(a,1,20);
就是對a指向的記憶體的20個位元組進行賦值,每個都用ascii為1的字元去填充,轉為二進位制後,1就是00000001,佔乙個位元組。乙個int元素是4位元組,合一起就是1000000010000000100000001,就等於16843009,就完成了對乙個int元素的賦值了。
另一篇文章講的也比較好:
memset的正規用法是只能用來初始化char型別的陣列的,也就是說,它只接受0x00-0xff的賦值
然而,在大多數情況下,需要對乙個double或int的陣列賦乙個相對很大或很小的初值
以下的賦值方式是不正確的:
memset(arr,2147483647,sizeof(arr));
但是可以用一些技巧,來得到乙個差不多的最大值,比如像:
memset(arr,0x7f,sizeof(arr));
它將arr中的值全部賦為2139062143
這是用memset對int賦值所能達到的最大值
類似的還有:
memset(arr,0x80,sizeof(arr)); //set int to -2139062144
memset(arr,0x7f,sizeof(arr)); //set double to 1.38242e+306
memset(arr,0xfe,sizeof(arr)); //set double to -5.31401e+303
乙個memset引發的血案
前幾天做了一道bst題,提交了幾次都是wa,今天抽空拿了出來仔細瞧瞧總算被我發現禍頭根源.總結原因還在於自己對memset不太了解,以前用對估計也是瞎貓撞見死耗子 memset的介紹 void memset void buffer,int ch,size t count buffer 指向某段記憶體...
乙個由copyBean引發的血案
一次開發中使用輪子bean互轉突然發生了問題 new setdlevel 1 dto dto new dto dto beancopyutils.copybean dto.class system.out.println dto.getdlevel 列印出輸出結果 輸出結果卻變成null,怎麼肥事呢...
乙個由鬥地主引發的血案
王炸 看到這個小故事我也試著拿筆去算了算,唉,尼瑪,去試一下自己的智商下限 然後得出如下思路 地主20,農民17,一共54張牌.那我直接用 20 54 地主拿一張王牌的概率 19 53 地主在有一張王后再拿到王的概率 然後兩個概率相乘 20 54 19 53不就得出了王炸的概率嘛?13.3 在確定王...