同樣的代碼在windows平台和在Linux平台上運行結果不同?

題主將下面的代碼分別在Windows上用VS編譯和在Linux上用g++編譯了一遍,運行結果卻是不一樣的,我很困惑,這只是一個簡單的字元串的測試代碼。為什麼不同的平台不一樣?下面是代碼:

Windows運行結果:

Linux運行結果:

str3 和 str4的地址在Windows上不一樣,在Linux上是一樣 的,這是為什麼啊,我覺得str3和str4的地址應該是一樣的啊。。。


OS就這麼躺槍了,這也太冤了吧。

這是個編譯選項的問題。即便同一個編譯器,用不同選項都會決定是否合併同樣的字元串常量。如果合併的話,內容相同的字元串常量就會是同樣的地址。

而頭兩個str[]的寫法,是搞出了兩個數組,把字元串分別拷貝過去,所以肯定不同地址。


VC++運行的是debug吧,release有一項可以修改的優化就是問你要不要合併相同字元串常量的地址。


char *str3 = "Hello, World";
char *str4 = "Hello, World";

後者常量字元串被歸併了吧,值相同,被優化成同一個地址了。


我是來瞎說的,

你可知 copy on write, 簡單的說,就是我比較懶,不想做太多事情,就借用的別人的東西(如果這樣做無傷大雅的話)

有的編譯器發現

char *str3 = "Hello, World";
char *str4 = "Hello, World";

丫的, str3 和 str4 的內容完全相同,大家比較懶嘛,就共用了一個 "Hello, World" (在常量區)。

題外話,對於在常量區的 "Hello, World", 你根本就不能改變,在上面深究指針,地址的意義是不大的。


這個是實現相關的行為 最好的辦法是避免這麼用 比如使用const char * 去防止修改字元串常量


這都是編譯器的區別,和平台沒關係。你在win下用gcc編譯看看,還是不一樣的結果嗎?


編譯器優化


首先一點是編譯器處理效果不同,與平台無關。

第二點至於gcc編譯器為何這樣處理是因為char *str3 = "HelloWorld"這裡面的"HelloWorld"是字元串常量不能被改變,str3指向這個字元串常量所存儲的地址,因為不能被改變所以同理str4也讓他指向這塊地址。這樣做避免了過多的內存浪費。

第三點當然是gcc的處理效果更好,因為VS又重新開闢了一塊存儲相同字元串常量的空間。

第四點最新的VS2015可能也是默認這樣處理的(答主沒試過...)。


推薦閱讀:

linux真的比windows更適合web開發者作為開發環境嗎?
Linux 錄屏軟體有哪些?
微軟有沒有可能為Linux系統開發桌面環境?
Linux 下 halt, poweroff, shutdown 有什麼區別?
Linux 與 OS X 哪個更適合個人使用?為什麼?

TAG:MicrosoftWindows | Linux | C | MicrosoftVisualStudio |