main()
{
int *p;
free(p);
}
此代码在 Win 2K 中崩溃。但不知何故不会在 Win Xp 中崩溃!知道为什么吗?
编辑:是的。这是一个错误,不应该写。更多信息:使用的编译器是 VC 6 编译器。在 Win Xp 机器上以发布模式编译代码。在多台装有 Win Xp 的机器上运行此代码的可执行文件。该代码没有导致任何崩溃。但是在多台 Win 2K 机器上运行相同的代码。每次都崩溃!!
main()
{
int *p;
free(p);
}
此代码在 Win 2K 中崩溃。但不知何故不会在 Win Xp 中崩溃!知道为什么吗?
编辑:是的。这是一个错误,不应该写。更多信息:使用的编译器是 VC 6 编译器。在 Win Xp 机器上以发布模式编译代码。在多台装有 Win Xp 的机器上运行此代码的可执行文件。该代码没有导致任何崩溃。但是在多台 Win 2K 机器上运行相同的代码。每次都崩溃!!
这是未定义的行为。它可能会崩溃,可能不会崩溃,甚至在显示器上绘制独角兽,对于未定义行为的行为没有规则。
您的代码是未定义的行为:您正在尝试使用(实际上是免费的)未初始化的指针。
由于这是 UB,因此尝试理解为什么它在一个操作系统上工作(或者更确切地说似乎)在另一个操作系统上工作是完全无关的:UB 的原则是“所有赌注都没有,任何事情都可能发生”。
这正是它所代表的代码吗?即,在初始化 p 之间没有任何内容?
作为一种猜测,我会说在您的 XP 系统上,编译器正在将 p 初始化为 NULL(我不认为它必须这样做,它就是这样)。在 2K 系统上,编译器只是将 *p 添加到堆栈中,值可以是任何值。
Free(p) 将正确处理 NULL 指针,但如果您的 2K 系统在堆栈上创建指针时没有将指针归零(我认为 C 标准不需要),那么它可能是 dnagling,因此是免费的(p) 可能会尝试释放一些任意内存,从而导致您出现问题。
如果你从
int *p = NULL;
free(p);
这会改变行为吗?