2011-02-15 80 views
1

我得到了我的程序的這種奇怪的行爲,我無法弄清楚。我的教授向我展示了一個缺陷,在我的程序中,我只是在構建一個對象時複製一個字符指針,而不是創建整個數組的新副本,因此您可以使用它。他用類似的代碼來證明這一點。嘗試設置字符數組的字符時程序崩潰

的代碼:

char sweat[] ="Sweater"; 
warenkorb = new WareImKorb(new Textil (205366,4.2,sweat,40),2,warenkorb); 
sweat[0] = '\0'; 

現在如果我反而使其:

char* sweat ="Sweater"; 

程序運行正常,直到我嘗試汗水[0] = '\ 0'; 它只是然後開始。

但是,這個作品: char cc [] =「毛衣」; char * sweat = cc;

這真的讓我感到困擾,我不明白,爲什麼版本1不起作用。 希望你們能幫助我,否則我會瘋狂地想知道這件事。

+0

對第一個版本不起作用的是什麼?你爲什麼使用char數組而不是std :: string? – CashCow 2011-02-15 18:00:39

回答

3
char* sweat ="Sweater"; 
sweat[0] = '\0' 

這裏sweat指向一個恆定的數據來完成。 「毛衣」是常量字面數據,位於只讀存儲器的某處,並且sweat也指向此數據。 它不會複製它。所以當你做sweat[0]='\0'時,它會嘗試改變CONSTANT數據的第一個字符。因此錯誤。順便說一句,如果你不在你的聲明中寫const作爲const char* sweater = "Sweater",好的編譯器應該給出警告。請參閱此處的警告:http://www.ideone.com/P47vv

但是,當您編寫char sweat[] = "Sweater"時,會創建一個char數組,從CONSTANT數據複製數據,該數據爲"Sweater";該數組的元素本身是可修改的!


讓我們來看看一個有趣的事情:因爲在第一種情況下,它不會使常量數據的副本,所以無論你有多少個變量聲明(都指向相同的數據),地址對於所有變量都是相同的。看到這一點:

#include<cstdio> 
int main() { 
     char* sweat ="Sweater";  //notice the warning 
     const char* another ="Sweater"; //no warning! 
     std::printf("%p\n", sweat);  //print the address 
     std::printf("%p\n", another); //print the address 
     return 0; 
} 

輸出:

0x8048610 
0x8048610 

手段,既printfs輸出打印相同的地址!

看到自己的位置:http://www.ideone.com/VcyM6

5

「Sweater」是一個字符串文字,它可能駐留在只讀存儲器中。使用char []語法將此文字複製到char數組中,使用char *語法(實際上應該是const char *)僅指向原始字符串文字。

0

在不起作用的版本中,您沒有創建任何字符數組。你只玩指針。

對於sweat[0] = '\0'是一個有效的語句,您需要sweat是一個實際的字符數組。

這僅與char sweat[] = "XXXX";或焦炭sweat[20];

0

C++是不是一個託管語言。避免創建指向不具有適當大小的字符數組的指針。下面的兩個例子是更好的解決方案:

char* sweater = new char[10]; 
sweater[0] = '\0'; 
delete [] sweater; 
sweater = NULL; 

或者更好的是:

std::string sweater = ""; 
2

ASCII藝術來救援!該char sweat[]版本看起來像這樣的記憶:

 +---+---+---+---+---+---+---+---+ 
sweat: |'S'|'w'|'e'|'a'|'t'|'e'|'r'| 0 | char[8] 
     +---+---+---+---+---+---+---+---+ 

儘管char* sweat版本是這樣的:

 +---+---+---+---+---+---+---+---+ 
     |'S'|'w'|'e'|'a'|'t'|'e'|'r'| 0 | const char[8] 
     +---+---+---+---+---+---+---+---+ 
     ^
     | 
     | 
     +-|-+ 
sweat: | | | char* 
     +---+ 

這是正確的,一個char*指向const char。事實上,你可以將一個字符串文字分配給非const字符指針,這在C++的靜態類型系統中是一個令人討厭的聖潔。詛咒你,向後兼容!

相關問題