2015-05-28 28 views
0

我對C++很陌生。我來自java領域,所以輸入/輸出系統讓我感到困惑,所以很抱歉,如果這是一個愚蠢的問題。嘗試讀取和寫入字符串時發生訪問衝突?

我試圖聲明一個字符串,保存一些控制檯輸入給它,然後打印字符串。

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    char* pizza = ""; 
    std::cin >> pizza; 
    std::cout << pizza; 


    return 0; 
} 

我得到一個訪問衝突異常,這讓我想我有一個無效的內存地址。

回答

5

我會解釋你的代碼有什麼問題,但首先是正確的代碼。

#include <string> 
#include <iostream> 

int main() 
{ 
    std::string pizza; 
    std::cin >> pizza; 
    std::cout << pizza; 

    return 0; 
} 

它使用標準庫字符串類而不是char*。現在到你的代碼。

char* pizza = ""; 

這是錯誤的。它按照較老的標準進行編譯,但即使那樣,它仍然是一個糟糕的主意。字符串文字,如"",是常量字符數組。通過上面的代碼,您可以爲這個常量字符數組指定一個非const指針。在涉及數組和指針的所有其他上下文中,這是非法的,因爲它應該是。由於歷史原因,允許(直到C++ 11)字符串文字,但你仍然不應該這樣做。因爲即使你有一個非const的指針,寫入它指向的位置仍然是非法的,這就是爲什麼當你嘗試這樣做時你會遇到訪問衝突:

std::cin >> pizza; 
+0

爲什麼我不能使用char *? – grey00

+0

@ user3238865:你可以,你只需要知道如何正確使用它。即您需要正確分配內存並將'char *'指向此內存。你需要小心,不要讓你分配的內存溢出,還有其他一些問題。但除了在語言中獲得編程經驗之外,你會浪費你的時間,因爲所有這些問題都已經解決了,並且解決方案被封裝在經過廣泛測試的'std :: string'類中。 –

1

您需要給數組一些空間。像:

char pizza[50]; 

這是去工作,但是這個代碼可能是寫過去的數組的邊界(和C++標準,這只是不確定的行爲)。正如其他海報指出的那樣,使用std::string會更明智,更易於使用。

您可以查看this教程以獲取基本C++輸入/輸出的快速介紹。

+0

謝謝,這個工程!我懷疑是這個問題,並試圖做一些像'char * pizza =「aaaaaaaaaaaaaaaa」'但這不起作用。是否有任何理由必須以這種方式給予空間? – grey00

+0

@ user3238865這裏的主要問題是你來自你不管理內存的Java土地。爲了快速介紹C++,您可以先閱讀[Java To C++ Tutorial](https://cs.brown.edu/courses/csci1230/docs/java_to_cpp.shtml) – JosEduSol

+1

不,主要問題是他從一個C++學習C++可怕的來源。使用適當的C++,您不必管理內存。在C++中進行手動內存管理是一種權利,而非授權。 –

相關問題