C++ 在不同的操作系统中编译/执行代码是否存在差异?
我刚刚发现了一个问题,我不知道它可能是什么。我几周前开始学习编程,现在正在学习指针 我在两台不同的电脑上编译了完全相同的代码。在第一种情况下,程序运行良好。在第二种情况下,当它到达某条线时停止工作 我用两台电脑。 我工作场所的那台运行Windows XP SP3。在这一次中,程序运行良好 我家的那台运行Windows7SP1。它编译了代码,但程序不起作用C++ 在不同的操作系统中编译/执行代码是否存在差异?,c++,pointers,cout,C++,Pointers,Cout,我刚刚发现了一个问题,我不知道它可能是什么。我几周前开始学习编程,现在正在学习指针 我在两台不同的电脑上编译了完全相同的代码。在第一种情况下,程序运行良好。在第二种情况下,当它到达某条线时停止工作 我用两台电脑。 我工作场所的那台运行Windows XP SP3。在这一次中,程序运行良好 我家的那台运行Windows7SP1。它编译了代码,但程序不起作用 我使用DeV C++和TDM GCC 5.1.0编写和编译两个系统。 #include<iostream> using names
我使用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的第一部分是读取指针的值
跟随(取消引用)未指向有效对象的指针也是未定义的行为,因为您不知道非法解释为地址的未指定值是否与类型正确对齐,或者是否映射到进程的地址空间
如果您成功地从该地址加载了某个整数,这是第三个未定义的行为,因为它的值也是未指定的
因此,最坏情况下的直接陷阱(硬件陷阱值和限制性对齐)是:
pointer == 0x1