2011-09-26 118 views
4

編程之前,我一直很困惑,但是這個需要蛋糕。基本上,我將該值設置爲一個for循環,並在接下來的迭代中更改爲下一個循環的值。變量本身的變化

for (int i = 0; i < 2; ++i) 
{ 
    for (int j = 0; j < numWords[i]; ++j) //numWords [0] = 9, numWords [1] = 7 
    { 
     stb[i][j].word = const_cast<char*>(is (j + 1,1).c_str()); //is(int,length[opt]) converts int to string, c_str() returns const char *, but I need char * 
     cout << is(j+1,1) << ' ' << stb[i][j].word << '\n'; 
    } 
} 

for (int i = 0; i < 2; ++i) 
{ 
    for (int j = 0; j < numWords [i]; ++j) 
    { 
     cout << stb[i][j].word << ' '; 
    } 
    cout << '\n'; 
} 

輸出:

 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
7 7 7 7 7 7 7 7 7 
7 7 7 7 7 7 7 

我唯一的猜測是現在的東西用const,但它沒有意義,爲什麼它會不斷地改變以往所有的數組元素...

+3

你還沒有向我們展示is()'。 –

+0

那麼,我其實只是找到了原因。首先,is()可以正常工作,但我剛剛瞭解到,由於字符串不必將每個字符存儲在連續的內存位置,只要傳遞給cstr()的字符串發生更改,從中。去圖我花了多少時間:/ – chris

+1

不要使用'const_cast'。永遠。 (當你有足夠的C++經驗知道它什麼時候會安全的時候,你會學到更好的技術。) –

回答

3

這非常簡單。你的程序有未定義的行爲(如果我對is()的假設是正確的)。

is(int, length)按值返回std::string。你可以通過使用c_str()得到一個指向內部結構的指針string。然後該字符串在完整表達式的末尾被破壞。這種破壞會使您從c_str()獲得的指針失效。

這意味着你用指向無效內存的指針填充數組。然後您從這些指針讀取數組,以打印出數組的內容。從無效內存中讀取會導致未定義的行爲。

所觀察到的行爲的可能的解釋是這樣的:

每個stringis返回重用相同的存儲器。在第一個循環中,您從內存中讀取的內容在被另一個is調用覆蓋之前被讀取,因此您會得到正確的值。在第二次循環中,你在從內存中讀取數據後,讀取數據中的最終值。

+0

這很有道理。現在我的問題是,我所嘗試的任何東西都不會按照預期的方式工作。我需要一個char *作爲單詞。 – chris

+1

@chris - 創建一個單獨的'std :: vector'或擁有這些字符串的數組,然後從該數組中的字符串中獲取'char *'s。 – Mankarse