2014-03-13 221 views
1
char ch[3]; 
strcpy(ch,"Hello"); 
cout<<ch<<" "<<sizeof(ch); 

Q1。爲什麼當ch的大小是3時打印「Hello」? Q2302。如果ch從ch [2]轉換爲ch [6](通過隱式類型轉換),爲什麼sizeof(ch)仍然是3?C++字符串到字符串轉換

+0

什麼是ch?我只看到'char a [3]' – taocp

+0

A1:未定義行爲; A2:它的類型根本沒有被轉換。 – 0x499602D2

+0

看起來代碼中存在一些錯誤,您使用char a [3],然後將其複製到「ch」而不是「a」。 – RacerNerd

回答

3

strcpy沒有進行大小檢查,所以它只是在內存地址寫入「Hello \ 0」,覆蓋內存中的任何位置。

沒有執行轉換,ch是char [3],因爲它在strcpy之前。

3

我假設當你輸入char a[3];你的意思是char ch[3];

A1:當你聲明一個大小的數組時,它可以達到你的不超過它。如果在這種情況下確實超過了它,則會得到未定義的結果。

A2:你不能像這樣轉換它,所以這是一個非問題。

3

你正在做一些非常危險的事情。這是使用std::string的原因之一,您無需檢查是否超出簡單複印範圍。

問題1:
與其他人一樣已經說過,它打印出「你好」是不確定的行爲,任何事情都有可能發生。但那不是全部。在你的代碼中寫出像你一樣的界限是很危險的。你基本上得到了一個Buffer Overflow,如果你看看維基百科的例子,你會發現它幾乎是你得到的相同的代碼。

問題2:
沒有轉換。當您撥打strcpy(ch, "Hello");您的陣列chdecays into a pointerstrcpy沒有辦法知道它可以在那裏安全地複製多少個字符,因爲指針不過是內存地址。它不知道在該位置有多少內存可用,因此即使(如你的情況)那樣,所有內容都會寫出所有內容。

像你在你的代碼中得到的東西是指針被稱爲不安全的原因之一。