原 乙個由memset引發的知識點

2022-03-24 16:49:04 字數 1729 閱讀 9153

[原]乙個由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 在確定王...