為了加強自己的記憶,我決定用文字記錄下來。
這是源**,主要是輸出環境變數,具體可以參考createenvironmentblock函式
1 #include 2 #include 3 #include 4 #include 5注釋部分可以不用看,主要注意 if (*(wnext+1) == l'\0') 這行#pragma comment(lib, "userenv.lib")
6#pragma warning(disable : 4996)78
intmain()9*/
22 wchar_t* wnext =null;
23 lpvoid penvironment =null;
24 ok = createenvironmentblock(&penvironment,
25htoken,
26false);
27if (!ok)
2831
32 wchar_t* wtemp = (wchar_t*)penvironment;
3334
do35
42else
4347 } while (1
);48
49return0;
50 }
下面兩張圖分別是控制台輸出結果和記憶體位元組
從第二張圖可以看到控制台列印到windir=c:\windows之後,下面就會列印空行,再然後就會進入break,這是為什麼呢?
我們已知寬位元組佔兩個位元組,所以一次會跳過2個點,包括r. s. 等等,我們在執行wnext = wtemp + wcslen(wtemp)+1這行**時,實際上是相當於wtemp位址往後移動 wcslen(wtemp)+1個位址位,而我們在往後移動 wcslen(wtemp)時,我們其實到達了c.:.\.w.i.n.d.o.w.s.的s.的位置,再+1就相當於到c.:.\.w.i.n.d.o.w.s...的位置,+1的原因是為了跳過\0的字串結束位,到這邊是將(..)這個空的賦給wnext,而在執行到下一行**if (*(wnext+1) == l'\0'),位址相當於又往後面移動乙個寬位元組,也就是c.:.\.w.i.n.d.o.w.s.....,然後我們判斷這之後的(\.),把它與l'\0'進行比較,發現它不為0,然後**跳到else上面。
重點來了,wtemp = wnext;這行**其實是把c.:.\.w.i.n.d.o.w.s...後面的(..)這個空的記憶體位元組賦給wtemp,列印為空,並不是c.:.\.w.i.n.d.o.w.s.....,因為c.:.\.w.i.n.d.o.w.s.....這個只是後面用於比較的,然後到wnext = wtemp + wcslen(wtemp) + 1這行**,之前wtemp為空,所以wcslen(wtemp) = 0, 再+1,往後面移乙個位址,就到了c.:.\.w.i.n.d.o.w.s.....上的最後乙個點的位置,接著執行到下一行**if (*(wnext+1) == l'\0'),位址上再+1,相當於跳過了(\.),我們需要比較(\.)後面的值,也就是(..),可以看到是空,然後與l'\0'相同,到了break,跳出while迴圈,程式結束。
這段**的正確輸出要把if (*(wnext+1) == l'\0')中的+1去除,這樣避免指標指向未知的記憶體區域。
可能寫的有點亂,僅供參考吧,我也是第一次接觸,很多術語都沒怎麼明白。
對記憶體的深入理解
隨機訪問儲存器 ram 能夠與cpu直接的進行資料的交換 可以隨時的進行讀寫,速度快 斷電後不儲存資料 唯讀儲存器 rom 只能讀取資料不能寫入資料 非易失性 時序控制邏輯 產生儲存器操作所需的各種時序訊號 位址暫存器mar 存放訪存位址,位址解碼後找到所選的儲存單元 資料暫存器mdr 暫存要從儲存...
程式設計師對記憶體的理解
收藏 在c和c 語言開發中,指標 記憶體一直是學習的重點。因為c語言作為一種偏底層的中低階語言,提供了大量的記憶體直接操作的方法,這一方面使程式的靈活度最大化,同時也為bug埋下很多隱患。因此,無論如何,我們都要對記憶體有乙個清晰的理解。32位作業系統支援4gb記憶體的連續訪問,但通常把記憶體分為兩...
個人對記憶體洩漏和記憶體溢位的理解
記憶體洩漏 從語義上講就是記憶體外露了的部分,跟傷口一樣,那麼就被細菌覆蓋,我們要及時把它 就應該去除細菌貼上邦迪,把傷口藏起來,就相當於釋放記憶體,讓壞蟲子走開,不讓它們占有不該占有的東西。編完了,來看下實際解釋 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶...