Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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
无效指针的条件 无效指针是指向当前程序不能访问的指针指针,如果尝试使用无效指针,则OS将阻止它发生,在C++入门2章中说_C++ - Fatal编程技术网

无效指针的条件 无效指针是指向当前程序不能访问的指针指针,如果尝试使用无效指针,则OS将阻止它发生,在C++入门2章中说

无效指针的条件 无效指针是指向当前程序不能访问的指针指针,如果尝试使用无效指针,则OS将阻止它发生,在C++入门2章中说,c++,C++,将无效指针用作条件或在比较中使用是未定义的 但我只是尝试比较指针,而不是去引用它们,如何解释C++中的句子? < p>底漆说行为是不确定的。< /P> 在大多数情况下,不定义行为是因为说出任何其他内容(如比较无效指针返回false)将意味着性能成本(额外内存、额外检查)。这并不意味着比较不会返回结果。这意味着编译器在这一点上可以做任何它想做的事情(包括) 由于编译器可以在这种情况下执行任何操作,因此它可以假设两个指针都有效,并跳过对它们周围有效性的检查。它可以假设结果是它允许它删除大部分代码的任

将无效指针用作条件或在比较中使用是未定义的


<>但我只是尝试比较指针,而不是去引用它们,如何解释C++中的句子?

< p>底漆说行为是不确定的。< /P> 在大多数情况下,不定义行为是因为说出任何其他内容(如比较无效指针返回false)将意味着性能成本(额外内存、额外检查)。这并不意味着比较不会返回结果。这意味着编译器在这一点上可以做任何它想做的事情(包括)

由于编译器可以在这种情况下执行任何操作,因此它可以假设两个指针都有效,并跳过对它们周围有效性的检查。它可以假设结果是它允许它删除大部分代码的任何结果(如果您在if中使用它)

此外,既然在这一点上没有人能告诉你比较的结果是什么,怎么会有人认为这个程序是正确的(也就是说它会做你说它应该做的事情)

因此:

  • 你能比较无效指针吗?当然
  • 结果稳定吗?可能不会
  • 这会崩溃吗?也许吧
  • 你应该在程序中使用它吗?不,无论如何都要避免

简单的解释是“不要这样做”,就是这样。如果指针指向无效地址,您为什么要以任何方式使用它?什么实际用例需要这样做?除了一个X/Y问题外,不清楚你到底在问什么。此外,“操作系统将阻止它发生”也不是这样;未定义的行为是未定义的,您的程序可能会炸毁您的水槽或给您沏茶,或者它可能什么也不做,或者它可能会以看似正确的结果运行。正如山姆所说,唯一真正的答案是“不要这样做”,。。。这样,编译器和体系结构设计者就不必考虑复杂的逻辑来实现对错误地址的处理。唯一允许的“错误”地址是超过数组的地址。事实上,在大多数体系结构上,您都不会遇到崩溃,例如,请参见此处:,即使使用“清理”也不会抱怨。一个(公认的古老)示例来自Windows在386上运行的时代,指针(对于某些内存模型)分为两部分:段和偏移。段值告诉硬件内存在应用程序中的位置;如果该段无效,并且您试图查看指针的值,则会出现硬件异常,即程序会崩溃。那么,什么是无效指针,它只是指针的地址超出范围或指向的地址没有任何对象?@AlanJian我不知道确切的定义,你得查一下说明书。如果您调用delete,或者如果您有一个指向超出范围的对象的指针,那么这将是无效的。可能有一些具有多线程和就地构造的特殊情况,最好检查规范。