2014-07-26 47 views
0

花費整個下午調試一個問題。完全混淆爲什麼我可以從空列表中打印第一個元素。看來這是C++問題或我的程序問題。這似乎c + +隨機指向本地地址,當我嘗試訪問的第一個元素爲什麼我可以在空列表中打印第一個元素?

int main(int argc, char **argv) 
{ 
     string crc_command = "ls /tmp/jacknotexist"; 
     list<string> crc_output; 
     printf("list begin:%s\n", (*(crc_output.begin())).c_str()); // The result is "ls /tmp/jacknotexist". Why??? 
     printf("list size:%d\n", crc_output.size()); // It is zero as expected. 
} 
+2

因爲C++不牽着你的手,並告訴你,如果你不遵守其規則。你不支付你不使用的東西。 – chris

+0

說實話我得到了一個分割錯誤..反正chris是對的:訪問越界內存是未定義的行爲。標準模式是檢查邊界和**然後**讀取 –

+0

順便說一下,使用'printf'打印size()的結果是不安全的。 '%zu'很有可能是正確的格式說明符,但你不能確定。 – chris

回答

2

結果是「LS的/ tmp/jacknotexist」。爲什麼???

其實,結果是不確定的行爲:即使列表是空的,其begin()函數返回某個值(這恰好是等於end()函數的返回值)。當你解引用迭代器時,它會再次產生一些值。此時,行爲未定義,並且程序可能會在其他任何平臺上崩潰。

從本質上講,這與取消引用無效指針時得到的行爲是一樣的:程序可能會崩潰,也可能不會崩潰,它可能會產生任何值。在你的情況下,無效值恰好與crc_command變量的內容一致。

相關問題