2015-02-10 51 views
0

動態分配內存所以主要問題是有運行時錯誤代碼:錯誤當一個char *

char *wordBank[]= {new char[numWords+1]}; 
char buffer1[41]; 

for(int i=0; i<numWords;i++){ 
    ifile >> buffer1; 
    int len = strlen(buffer1); 
    cout << buffer1<<"and"<<len <<endl; 
    wordBank[i] = new char[len + 1]; 
    strncpy(wordBank[i], buffer1,len); 
    cout << wordBank[i]<<"and"<<len <<endl; 
} 

是它開始亂用是什麼的Wordbank。它將文本從txt文件中獲取到buffer1中,然後將其複製到動態分配的wordBank的char *數組中。但是,我總是會出現分段錯誤,而且這些詞都是不正確的。我做錯了什麼?

+2

'wordbank'只有一個元素。 'numWords'是該元素中的字符數。 – Barmar 2015-02-10 02:10:01

+0

你想要:'std :: string wordBank [MAX_WORDS];'。不要亂用C風格的字符串。 – 2015-02-10 02:12:03

+4

@ThomasMatthews你想'std :: vector wordBank;'不要亂搞C! – 2015-02-10 02:13:07

回答

2

這條線是錯誤的:

char *wordBank[] = {new char[numWords+1]}; 

wordBank是具有一個元素的數組,一個元件的值是一個指向一個字符陣列numWords+1字符。當你訪問wordBank[1]時,你超出了數組的範圍,這導致了未定義的行爲。

你顯然需要的是:

char **wordBank = new char*[numWords]; 

這將創建的numWordschar*元素,然後你會在for循環分配一個動態分配的數組。我不認爲numWords+1有任何需要。

3

可以使用而不是C C++簡化代碼:

vector<string> wordBank(numWords); 
string buffer1; 
for (int i = 0; i < numWords; i++) { 
    ifile >> buffer1; 
    size_t len = buffer1.length(); 
    cout << buffer1 << "and" << len << endl; 
    wordBank[i] = buffer1; 
    cout << wordBank[i] << "and" << len << endl; 
} 

或者也可以簡單,但添加錯誤檢查:

vector<string> wordBank(numWords); 
for (int i = 0; i < numWords; i++) { 
    if (ifile >> wordBank[i]) 
    cout << wordBank[i] << "and" << len << endl; 
    else { // no more words 
    wordBank.resize(i); // chop off the unused portion 
    break; 
    } 
}