標籤:

C++中char是如何在地址中存儲的?

如圖,生成幾個不同變數以及對應指針,輸出指針值和指針值加一的地址,為什麼只有char不是 原地址+類型位元組長度?


cout輸出的不是字元串么???

你可以用printf,或者 cout&<&<(void*)(cp+1) 試試。。。

至於為什麼char*就不輸出地址了??我猜測可能是對char*類型和ostream類型定義了&<&<運算符。。。

如果你開心,你也可以定義自己的重載運算符,比如:

#include&
ostream operator&<&<(ostream out, const char* s){ printf("fuck"); return out; }

這個時候它就不會輸出亂碼,而是輸出

fuck


你家short還是四個位元組的呢,我也不知道為什麼。


可以參考這個問題:http://www.zhihu.com/question/52252124

簡單來說就是 char* 有特殊處理。


因為char *可以表示字元串。輸出const char *時,輸出的是從該地址開始的以0結尾的字元串。這裡cp指向的是棧上的地址,vs調試模式下棧上空間會填充0xcc,也就是燙燙燙…

外國人編程出錯也會出現「燙燙燙燙」嗎?為什麼會出現這個? http://www.zhihu.com/question/23600507?utm_source=com.microsoft.bitesutm_medium=social (分享自知乎網)


有點懷疑故意釣魚,這種問題我都不需要Copy到電腦上運行,因為我用過的所有平台c,c艹里,包括不限於x86,x64,arm,mips,單片機下的各種五花八門的編譯器,Char型指針加1,地址量偏移都是1,為什麼會出現題中所說現象呢,因為第一個列印,輸出的是char型指針,而且指向的內容又不是文字,列印時就打出一堆亂碼,short型指針看起來就排在第一個了所以是2,仔細看截圖也可發現,代碼里有7條列印,截圖裡不加亂碼那條是6條,加上亂碼那條才是7條


輪子哥看錯了吧。

想輸出請轉void*

事實證明仍為 原地址+類型位元組長度

而且你注意你第二個輸出少了一個a,這也證明了是 原地址+類型位元組長度


推薦閱讀:

C++中為什麼說在構造器或析構器中使用異常處理會可能產生嚴重的問題?
如何理解 struct 的內存對齊?
C++內存劃分類型?
在c++中指針是否能夠被完全替代?甚至是不使用指針?
C++ 是 2012 年不宜進入的技術點嗎?

TAG:內存管理 | C |