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