首先,什麼都不說,我們來看一段**,然後試著編譯執行:
問題一:為什麼會出現「屯」?
下面,我們稍微改動一下,再來看看:
#include #include #include using namespace std;
int main()
{ string str;
char s[10];
str.push_back(s[0]);
str.push_back(s[1]);
cout執行結果截圖:(注意:正常情況下編譯時會出現以下情況,continue)
生成結果:
問題二:
為什麼會出現這個大家很熟悉的「燙」字?
在學習c++的時候,也許我們遇到的最多的兩個漢字就是他們了(vc平台),有人可能會想,這是為什麼?換句話說,對於上述二個問題,你有什麼看法?下面請跟著我一步步的去**這裡面的原因:
首先對於問題一:
我們要清楚的一點是,這究竟是個例,還是普遍現象?我們再來驗證一下:
看到結果之後,我們基本可以肯定,這並不是乙個個例,而是普遍存在的現象(vc平台)。我們都清楚,在c++中,一般分成棧區域(stack),堆區域(heap),**區(code area),資料區(data area)(又分為自由儲存區,全域性/靜態儲存區,常亮儲存區).此處,我們僅僅考慮堆區域,和棧區域和自由儲存區。堆區域一般存放的是動態記憶體,供程式隨機申請使用,但是記憶體的申請與釋放必須程式設計師親力親為,常見的比如new出來的記憶體塊。棧區域則存放程式需要的區域性資料,這些資料可以動態的反應程式中對函式的呼叫狀態,一般來說系統自動**。自由儲存區是那些由malloc等分配的記憶體塊,跟堆有點相似。這些是c++程式設計師應該掌握的一些基本內容。接著來,
乙個漢字佔兩個位元組,經過以上驗證,我們至少可以肯定的說,堆(還有自由儲存區)未初始化時的內容是最多以兩個位元組(都是漢字"屯"嘛,當然也更可能是以乙個位元組為單位,因為也可能存在gbk編碼重複的嘛(真實情況就是這樣啦!後面驗證。。))為單位的資訊(至於什麼資訊,後面再來驗證)。
為了弄清,這裡的"屯"字究竟是什麼,請轉到我的其中一篇博文然後在該頁面按ctrl + f, 查詢"屯"字的gbk編碼,是不是下面這個情況呢?
相信這個大家都能看得懂吧,顯然,"屯"字的gbk編碼為「cdcd",這是16進製制,那麼這不就是說,每個字元的gbk編碼是cd麼? 顯然這是乙個負數-51,於是我們就可以下結論了,堆空間(還有自由儲存區)未初始化時的預設字元是-51。不過,至於為什麼一定要是-51,這個估計就要問微軟了。。
至此,問題一基本上已經回答完畢,那麼問題二是不是也很簡單呢?
最近遇到的幾個純C程式設計的陷阱
首先是乙個不容易看出來的語法上的陷阱 經過除錯得出的錯誤是對非socket的socket操作出錯,sockfd在除錯過程中發現是0,不是乙個合理的檔案描述符。仔細一看原來是括號忘記加了,該運算是先用socket返回乙個檔案描述符fd,然後將fd 0的結果賦給sockfd,正常建立的socket的檔案...
C語言程式設計時遇到的若干問題
還是基礎不夠紮實,有一些基本的問題都不是很清楚,這裡記錄一下,以備遺忘。1.關於sizeof與strlen 如果變數是陣列,那麼呼叫sizeof的結果就是陣列的大小,但是如果只是乙個指標,那麼他只是返回乙個sizeof 型別 的值。而strlen是判斷字串的長度,所以乙個陣列的最後一位是strlen...
程式設計時遇到的問題,以及回答
前期用到了一些函式,但是忘記了整理,從現在開始整理。1.cumtrapz 用這個函式進行離散資料積分是可行的,但是使用trapz求積分卻不行 這裡我針對trapz定義了區間,但是出來的線段不對勁 是這兩個函式的區別導致的錯誤嗎?還是我trapz使用錯誤?答 trapz只有最終值,而cumtrapz是...