C++ 为什么我可以打印空列表中的第一个元素?
花整个下午调试一个问题。完全搞不懂为什么我可以打印空列表中的第一个元素。看来这是C++问题或我的程序问题。当我尝试访问第一个元素时,C++似乎随机指向本地地址。C++ 为什么我可以打印空列表中的第一个元素?,c++,containers,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", (*(cr
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.
}
int main(int argc,char**argv)
{
字符串crc_command=“ls/tmp/jacknotexist”;
列出crc_输出;
printf(“列表开始:%s\n”,(*(crc_output.begin()).c_str());//结果是“ls/tmp/jacknotexist”。为什么???
printf(“列表大小:%d\n”,crc_output.size());//如预期的那样为零。
}
结果是“ls/tmp/jacknotexist”。为什么
实际上,结果是未定义的行为:即使列表为空,其begin()
函数也会返回一些值(恰好等于end()
函数返回的值)。当您取消引用该迭代器时,它再次生成一些值。此时,行为尚未定义,程序可能会在任何其他平台上崩溃
从本质上讲,这与取消引用无效指针时的行为相同:程序可能会崩溃,也可能不会崩溃,它可能会产生任何值。在您的情况下,无效值恰好与
printf
打印size()
的结果是不安全的。有一个很好的机会,