2011-06-04 25 views
2

的這是一個恥辱,我無法弄清楚這些基本的東西對C++的,但C風格的字符串作爲我不會期望。例如,我創造這樣的: char* cstr = new char[1];單個字符C風格串滿垃圾

它初始化爲:Íýýýýý««««««««它。正常情況下,我可以設置第一個字符,因爲其他字符不是真正存在的(或者我認爲它們不是)。在工作時使用白色c風格的字符串,所有這些垃圾都可以使用,並且一切正常。

現在我是混合性的std :: string白衣的C-stlye一個和我所得到的是一個爛攤子。惠特此代碼:

std::string str = "aaa";

str += cstr;

我結束了白衣:aaaÍýýýýý««««««««它,但現在這些字符實際存在的string.size()返回長度,包括這個垃圾。

我找不到爲什麼會發生這種情況,但它必須連接whit字符串創建,因爲類似char * cstr =「aaa」會導致aaa沒有任何額外的垃圾,但嘗試更改字符串初始化這種方式結果在內存訪問衝突。有人能解釋我這種行爲嗎?謝謝!

PS:我的JavaScript無法加載,所以如果有人能正確地格式化這個職位,我會很高興!

答:哦,上帝​​!我怎麼能忘記這一點......感謝所有人,好吧,立即回答。最好的一個來自minitech,所以我將這個標記作爲答案,只要我的Java腳本加載:/

回答

6

所有的C風格的字符串是空終止的。所以,使用new char[1]初始化一個字符串會留下空間來放置任何字符。除了\0之外,您不能將第一個字符設置爲任何內容,否則正常的字符串操作會一直讀到內存中直到找到零。所以請使用new char[2]

1

當您使用new char[1]時,您請求一個字符數組的空間。沒有要求所述字符被初始化。因此,您看到的「垃圾」是未初始化的內存。在將數組視爲C風格的字符串之前,應該這樣做:

cstr[0] = '\0'; 
1

c樣式的字符串是NULL定界的。因此,要忽略內存中的任何垃圾,您需要將空字節('\0')置於字符串正文中。否則,系統庫函數將查看以字符串開始開始的所有字節,直到它們在內存中滿足NULL字節(它將位於某個隨機位置)。

這也意味着要實際需要分配2個字節的一個字符的c樣式字符串:一個用於有意義的字符,另一個用於'\0'

2

C風格串需要NUL'\0')終止子;它們沒有像C++字符串那樣的長度。所以你的單字符串必須是new char[2];它不會被初始化;你將需要確保它以\0終止。

5

與C風格字符串的工作,你需要有一個空終止:

char* cstr = new char[2]; 
cstr[0] = 'X'; 
cstr[1] = '\0'; 

說了這麼多,這是非常糟糕的代碼做以上。除非你有一個非常好的理由,否則請使用std::string。它負責爲你分配和釋放內存。