为什么我可以打印空列表中的第一个元素

Why I can print the first element in an empty list?

本文关键字:第一个 元素 列表 我可以 打印 为什么      更新时间:2023-10-16

花一下午的时间调试一个问题。完全困惑为什么我可以从一个空列表中打印第一个元素。这似乎是c++问题或我的程序问题。当我试图访问第一个元素

时,c++似乎随机指向本地地址
int main(int argc, char **argv)
 {
         string crc_command = "ls /tmp/jacknotexist";
         list<string> crc_output;
         printf("list begin:%sn", (*(crc_output.begin())).c_str()); // The result is "ls /tmp/jacknotexist". Why???
         printf("list size:%dn", crc_output.size()); // It is zero as expected.
}

结果为"ls/tmp/jackknoexist "。为什么? ?

实际上,结果是未定义的行为:即使列表是空的,它的begin()函数返回一些值(恰好等于end()函数返回的值)。当你对这个迭代器解引用时,它又会产生一些值。此时,行为是未定义的,程序可能在任何其他平台上崩溃。

从本质上讲,这与解引用无效指针时的行为是相同的:程序可能会崩溃,也可能不会崩溃,而且它可能产生任何值。在您的情况下,无效值恰好与crc_command变量的内容一致。