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

时间:2014-07-26 21:19:55

标签: c++ containers

花一整个下午来调试一个问题。完全混淆了为什么我可以从空列表中打印第一个元素。这似乎是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.
}

1 个答案:

答案 0 :(得分:2)

  

结果是“ls / tmp / jacknotexist”。为什么???

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

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