C++ 在不同的操作系统中编译/执行代码是否存在差异?

C++ 在不同的操作系统中编译/执行代码是否存在差异?,c++,pointers,cout,C++,Pointers,Cout,我刚刚发现了一个问题,我不知道它可能是什么。我几周前开始学习编程,现在正在学习指针 我在两台不同的电脑上编译了完全相同的代码。在第一种情况下,程序运行良好。在第二种情况下,当它到达某条线时停止工作 我用两台电脑。 我工作场所的那台运行Windows XP SP3。在这一次中,程序运行良好 我家的那台运行Windows7SP1。它编译了代码,但程序不起作用 我使用DeV C++和TDM GCC 5.1.0编写和编译两个系统。 #include<iostream> using names

我刚刚发现了一个问题,我不知道它可能是什么。我几周前开始学习编程,现在正在学习指针

我在两台不同的电脑上编译了完全相同的代码。在第一种情况下,程序运行良好。在第二种情况下,当它到达某条线时停止工作

我用两台电脑。 我工作场所的那台运行Windows XP SP3。在这一次中,程序运行良好

我家的那台运行Windows7SP1。它编译了代码,但程序不起作用

我使用DeV C++和TDM GCC 5.1.0编写和编译两个系统。

#include<iostream>
using namespace std;

int main (void) {
  int* pointer;
  cout << "pointer == "  <<  pointer << "\n";
  cout << "*pointer == " << *pointer << "\n"; // this is the line where the program stops. 
  cout << "&pointer == " << &pointer << "\n";

return 0;}
在第二台计算机中,它停在第二行

pointer == 0x1
我知道指针没有分配给变量。因此,它不存储任何正确的地址。即使如此,它至少应该显示其中的垃圾值,或者显示一个“0”来表示它还没有指向的地址。我知道代码是正确的,因为它在第一台电脑上运行良好。但我不明白为什么它在其他电脑上失败

我知道代码是正确的,因为它在第一台PC上运行良好

你不知道这样的事

您有未定义的行为,一个完全有效的结果是一个始终有效的程序。或者总是在周六以外的时间工作,或者总是工作到您完成测试并将其发送给付费客户之后,或者总是在一台机器上工作,而在另一台机器上总是出现故障

该行为未定义,未“定义为某种特定的一致可观察故障模式”

具体地说,未定义行为的真正风险不仅仅是某些操作的结果具有未指定的值,而是它可能具有未定义且不可预测的副作用-在程序的显然不相关的区域,或整个系统上

即使如此,它至少应该显示其中的垃圾值

是的。但是你让它去引用那个垃圾值

读取任何带有未指定值的变量本身就是未定义的行为,因此UB的第一部分是读取指针的值

跟随(取消引用)未指向有效对象的指针也是未定义的行为,因为您不知道非法解释为地址的未指定值是否与类型正确对齐,或者是否映射到进程的地址空间

如果您成功地从该地址加载了某个整数,这是第三个未定义的行为,因为它的值也是未指定的

因此,最坏情况下的直接陷阱(硬件陷阱值和限制性对齐)是:

  • 读取未指定的指针值,获取陷阱表示,使用硬件陷阱进行死亡
  • 或者读取未指定的指针值,将其解释为未对齐的地址,导致总线错误
  • 或者跟随未指定的指针指向未映射的地址,导致段冲突
  • 或者在前面的所有步骤中幸存下来—纯粹是偶然—从内存中的某个位置加载一些随机值。然后死亡,因为该值是陷阱表示
  • 但是,如果您的进程死掉了,那么您可以轻松地调试和修复它,而不会产生不良影响。从这个意义上说,在调用UB时崩溃实际上是最好的结果。替代方案更糟糕,更难预测,更难调试

    我知道代码是正确的,因为它在第一台PC上运行良好

    你不知道这样的事

    您有未定义的行为,一个完全有效的结果是一个始终有效的程序。或者总是在周六以外的时间工作,或者总是工作到您完成测试并将其发送给付费客户之后,或者总是在一台机器上工作,而在另一台机器上总是出现故障

    该行为未定义,未“定义为某种特定的一致可观察故障模式”

    具体地说,未定义行为的真正风险不仅仅是某些操作的结果具有未指定的值,而是它可能具有未定义且不可预测的副作用-在程序的显然不相关的区域,或整个系统上

    即使如此,它至少应该显示其中的垃圾值

    是的。但是你让它去引用那个垃圾值

    读取任何带有未指定值的变量本身就是未定义的行为,因此UB的第一部分是读取指针的值

    跟随(取消引用)未指向有效对象的指针也是未定义的行为,因为您不知道非法解释为地址的未指定值是否与类型正确对齐,或者是否映射到进程的地址空间

    如果您成功地从该地址加载了某个整数,这是第三个未定义的行为,因为它的值也是未指定的

    因此,最坏情况下的直接陷阱(硬件陷阱值和限制性对齐)是:

  • 读取未指定的指针值,获取陷阱表示,使用硬件陷阱进行死亡
  • 或者读取未指定的指针值,将其解释为未对齐的地址,导致总线错误
  • 或者跟随未指定的指针指向未映射的地址,导致段冲突
  • 或者在前面的所有步骤中幸存下来—纯粹是偶然—从内存中的某个位置加载一些随机值。然后死亡,因为该值是陷阱表示
  • 但是,如果您的进程死掉了,那么您可以轻松地调试和修复它,而不会产生不良影响。从这个意义上说,在调用UB时崩溃实际上是最好的结果。替代方案更糟糕,更难预测,更难调试

    我知道指针没有分配给变量。因此,它不存储任何正确的地址。即使如此,它至少应该显示其中的垃圾值,或“0”
    pointer == 0x1