Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我可以打印空列表中的第一个元素?_C++_Containers - Fatal编程技术网

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

花整个下午调试一个问题。完全搞不懂为什么我可以打印空列表中的第一个元素。看来这是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.
}
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()
函数返回的值)。当您取消引用该迭代器时,它再次生成一些值。此时,行为尚未定义,程序可能会在任何其他平台上崩溃


从本质上讲,这与取消引用无效指针时的行为相同:程序可能会崩溃,也可能不会崩溃,它可能会产生任何值。在您的情况下,无效值恰好与CCRIDEXECUTION/COD>变量> .p/>的内容重合,因为C++不支持您的手,如果您不遵守规则,就告诉您。你不用的东西你不用付钱。老实说,我有一个缺点。。无论如何,chris是对的:访问越界内存是未定义的行为。标准模式是检查边界,然后顺便读取,使用
printf
打印
size()
的结果是不安全的。有一个很好的机会, %ZU/COD>是正确的格式说明符,但你不能确定。这是代码< > []/COD>和成员函数<代码>()>代码>在处理向量时的真正区别,这里的原理是相同的,C++给了你工具,你应该更好地了解事物是如何工作的,或者应该在内存中工作。在C++中,我会使用STD::CUT。