1. 程式人生 > >Memset 初始化問題

Memset 初始化問題

初始化為無窮大為memset(a,0x3f,sizeof(0x3f));

下面談談無窮大的用法:

0x3f3f3f3f的十進位制是1061109567,也就是10^9級別的(和0x7fffffff一個數量級),而一般場合下的資料都是小於10^9的,所以它可以作為無窮大使用而不致出現數據大於無窮大的情形。

另一方面,由於一般的資料都不會大於10^9,所以當我們把無窮大加上一個資料時,它並不會溢位(這就滿足了“無窮大加一個有窮的數依然是無窮大”),事實上0x3f3f3f3f+0x3f3f3f3f=2122219134,這非常大但卻沒有超過32-bit int的表示範圍,所以0x3f3f3f3f還滿足了我們“無窮大加無窮大還是無窮大”的需求。

最後,0x3f3f3f3f還能給我們帶來一個意想不到的額外好處:如果我們想要將某個陣列清零,我們通常會使用memset(a,0,sizeof(a))這樣的程式碼來實現(方便而高效),但是當我們想將某個陣列全部賦值為無窮大時(例如解決圖論問題時鄰接矩陣的初始化),就不能使用memset函式而得自己寫迴圈了(寫這些不重要的程式碼真的很痛苦),我們知道這是因為memset是按位元組操作的,它能夠對陣列清零是因為0的每個位元組都是0,現在好了,如果我們將無窮大設為0x3f3f3f3f,那麼奇蹟就發生了,0x3f3f3f3f的每個位元組都是0x3f!所以要把一段記憶體全部置為無窮大,我們只需要memset(a,0x3f,sizeof(a))。

所以在通常的場合下,0x3f3f3f3f真的是一個非常棒的選擇。

因為char是1位元組,memset是按照位元組賦值的,相當於把每個位元組都設為那個數,所以char型的陣列可賦任意值,int是4個位元組,當memset(,1,sizeof()); 1相當於ASSCII碼的1,1轉為二進位制00000001,當做一位元組,一位元組8位,int為4位元組,所以初始化完每個數為00000001000000010000000100000001 = 16843009;

初始化最大值的方法:

如果你想初始最大化,第一位為符號位,不能為1,剩下全是1,也就是7個1,1111111化為

十六進位制正好為0x7f,所以memset(,0x7f,sizeof());就可以了

相關推薦

memset初始

sizeof 字節 矩陣 好處 需要 奇跡 一段 想要 set 上網搜了一下: 0x3f3f3f3f還能給我們帶來一個意想不到的額外好處:如果我們想要將某個數組清零,我們通常會使用memset(a,0,sizeof(a))這樣的代碼來實現(方便而高效),但是當我們想將某

uva368 水題 關於memset初始的位置

#include<algorithm>#include <iostream>#include <sstream>#include <cstdlib>#include <cstring>#include <cstdio>#include &

memset初始問題

memset填充方式是以1位元組為單位對記憶體進行填充,對於陣列進行初始化 int a[2]; memset(a,0,sizeof(a)); for(int i=0; i<2; i++) { cout<<a[i]<<' ';

memset初始陣列

memset初始化陣列(結構體也可初始化),不過我在此處並未對結構體初始化.. memst按位元組進行初始化,可以選擇將陣列初始化為0或初始化為-1   #include <iostream> #include<algorithm> #inc

memset初始結構體

memset可以方便的清空一個結構型別的變數或陣列。  如:  struct sample_struct  {  char csName[16];  int iSeq;  int iType;  };  對於變數  struct sample_strcut stTest;  

Memset 初始問題

初始化為無窮大為memset(a,0x3f,sizeof(0x3f));下面談談無窮大的用法: 0x3f3f3f3f的十進位制是1061109567,也就是10^9級別的(和0x7fffffff一個數量級),而一般場合下的資料都是小於10^9的,所以它可以作為無窮大使用而不致出現數據大於無窮大的情形。 另一方

memset() 初始類物件

今天看到迅雷2014校招一道筆試題如下: #include <iostream> usingnamespace std;   class parent   {   public:  

memset初始陣列的問題(不能初始特定的數)

memset用於初始化陣列,僅能初始化為0值, 而不能初始化一個特定的值。 因此,如果對申請的一段存放陣列的記憶體進行初始化,每個陣列元素均初始化為特定的值,必須使用迴圈遍歷來解決。 C++ Reference對memset函式的解釋: void * memset (

memset 對每個字節進行初始 (0,-1)

依靠 初始 結果 memset 二進制 size 字節 mem -1 memset是依靠二進制進行初始化,int是4個字節,memset把每個字節都賦值,也就是說, 比如memset(a,2,sizeof(a)) 則00000010 00000010 00000010 00

memset結構體初始

http log 結構 sha 方便 AR test name truct memset可以方便的清空一個結構類型的變量或數組。    如:   struct sample_struct   {   char csName[16];   int iSeq;   int iT

c++使用memset進行初始

今天在複習記憶化搜尋的時候突然看到使用memset進行初始化的方式。 使用memset初始化有一些注意事項。 1.對於不屬於char型的陣列,要注意不能直接寫為memset(dp,1,sizeof(dp))來將陣列初始化為值1。 原因:https://blog.csdn.net/ven

為什麼memset函式不能初始int函式

memset函式是以位元組為單位賦值的,int是四個位元組,所以給int初始化還用memset就會出錯,看下實驗吧 首先,下邊這個是給字元型陣列賦值,因為字元型陣列每個元素都佔一位元組,所以可以爭取的輸出陣列元素 #include<stdio.h> #include<str

c++中memset給一個struct或class初始,賦0

memset函式的用法 將緩衝區設定為指定的字元。 下面是網上常見的說法,也就是memset函式的用法 函式功能是:將s所指向的某一塊記憶體中的前n個位元組的內容全部設定為ch指定的ASCII值,

acm中用memset給陣列初始

標頭檔案:cstring 或 memory 話說剛開始使用memset的時候一直以為memset是對每一個int賦值的,心裡想有了memset還要for迴圈對陣列進行初始化幹嘛。但其實memset這個函式的作用是將數字以單個位元組逐個拷貝的方式放到指定的記憶體中去。 比如

重新認識memset函式及c++中陣列的初始賦值

下面就好好重新認識一下這個函式,自己寫了測試的程式碼,memset到底怎麼用呢? 先貼測試程式碼: #include<iostream> #include<cstdio> #include<algorithm> #include<string>

memset 陣列初始

void *memset(void *s, int ch, size_t n)1.功能是:將s所指向的某一塊記憶體中的前n個位元組的內容全部設定為ch指定的ASCII值, 第一個值為指定的記憶體地址,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作, 其返回

C++陣列(一維、二維、三維)的動態分配new、初始memset和釋放delete

【原文】http://blog.csdn.net/shanzhizi/article/details/7835752 陣列的動態分配、初始化和釋放經常用到,這裡總結一下,尤其是二維陣列 一維陣列 一維陣列的動態分配,初始化和撤銷都好說,幾乎每一本C++教材都會做出詳細的說明

memset函式為二維陣列初始

1int* a;  a = new int[10]; sizeof(a) 只會返回出來指標的大小,所以我們只能自己計算這個陣列的長度,這裡應當是sizeof(int) * 10, 因為數組裡面有10個int所以應該,memset(a, 0, sizeof(int)*10);/

memset函式初始和最短路中的最大值

在最短路中最大值: 最好把最大值設定為0x3f3f3f3f,而非0x7fffffff 理由如下。 #include<stdio.h> #include<string.h>

C++二維動態陣列memset()函式初始

先說說memset函式: void *memset(void *s,int c,size_t n)作用:將已開闢記憶體空間 s 的首 n 個位元組的值設為值 c。 memset()的內涵:用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為‘ ’