2014-09-25 63 views
-1
#include <iostream> 
using namespace std; 

int main(void) 
{ 
    char *YourName = new char[10]; 
    cout << "Enter your name:"; 
    cin >> YourName; 
    cout << "\nHere is what your entered:" << YourName; 
    return 0; 
} 

爲什麼這會允許存儲超過10個字符(空格除外)?這是因爲我正在創建一個指向字符數組的指針嗎?C++和cin char數組的簡單指針

+1

這是因爲*未定義的行爲*有時意味着工作得很好。你無法預測它。如果程序更長或更復雜,您可能會看到更嚴重的後果。 – 2014-09-25 02:44:01

+2

爲什麼不使用std:string? – 2014-09-25 02:55:35

回答

2

未定義的行爲意味着正好是那。未定義。

有時未定義意味着它可以作爲你指望它,甚至當你的期望是錯誤的,儘管你違反你的語言:-)

對於具體合同,大多數內存分配例程將工作在某種「分辨率」,例如16字節(爲了效率),這意味着請求將四捨五入到該值的下一個倍數。您可能會發現,您可以使用最多16個字節的任何內容填充您的10字節緩衝區,然後開始將其放入堆中。

這不會讓它好吧使用那額外的空間,它只是解釋了它爲什麼有時可能工作。

+0

我總是傾向於提及__Schrödinger的cat_或_interior black hole_場景,來詳細說明_undefined behavior_ ;-) ... – 2014-09-25 03:04:43

1

在一個更大和更復雜的程序中,額外的字符會壓在內存中的相鄰變量上。足夠多的額外字符最終會觸發操作系統保護,因爲它可以訪問尚未分配的內存。

指針正好指向。它沒有任何屬性知道它應該指向的長度。

0

這就是爲什麼總是使用std::cin.getline(YourName,10)所以10之後的字符將被忽略。

0

char*的提取器不知道數組的大小,所以除非明確地告訴它,否則它不能在10個字符後停止提取。這很危險,因爲它允許你輸入比分配給數組更多的字符。這會導致未定義的行爲。

這就是爲什麼建議您使用std::string而不是C風格的數組,因爲其內部緩衝區的大小可以隨着添加更多字符而增加。