C++ 即使我没有';我没有真正使用它

C++ 即使我没有';我没有真正使用它,c++,visual-studio,visual-c++,visual-studio-2012,language-lawyer,C++,Visual Studio,Visual C++,Visual Studio 2012,Language Lawyer,为什么在Visual Studio 2012中,以下代码在运行时崩溃 void foo(void* ptr) { } int main() { void* ptr; foo(ptr); } 运行时检查失败#3-使用变量“ptr”时没有 正在初始化 我知道可以通过将“基本运行时检查”选项设置为“默认”来禁用此错误,但我看不出在实际未取消引用指定指针时出现此错误的任何原因 这是一种有意的行为吗?即使只是传递一个指向正在“使用”它的函数的指针,如果该值未初始化,这在技术上是未定义的行为

为什么在Visual Studio 2012中,以下代码在运行时崩溃

void foo(void* ptr)
{

}

int main()
{
  void* ptr;
  foo(ptr);
}
运行时检查失败#3-使用变量“ptr”时没有 正在初始化

我知道可以通过将“基本运行时检查”选项设置为“默认”来禁用此错误,但我看不出在实际未取消引用指定指针时出现此错误的任何原因


这是一种有意的行为吗?

即使只是传递一个指向正在“使用”它的函数的指针,如果该值未初始化,这在技术上是未定义的行为

原因是,在某些硬件平台上,指针在特殊寄存器中传递,并且在寄存器设置时使用无效值将生成硬件陷阱,而不是在实际使用指针时


解决方案不是禁用检查,而是在使用指针之前初始化指针。如果您不知道要使用的值,那么只需选择
nullptr

当然,您是在逐值传递指针值。我看不出你为什么要写这样的代码。好吧,不要养成习惯,也不要射击信使。它实际上是在函数调用中使用的。您正在计算一个值不确定的表达式。标准上说这是UB。如果它不是UB,它的值定义是什么?“即使只是传递一个指针到一个你正在“使用”的函数,它在技术上是未定义的行为”--你能引用这个标准吗?它确切地取决于你指的是哪个标准,但它会有一些版本,".... 如果通过求值产生不确定值,则行为是未定义的……”在这里,在函数调用中求值
ptr
会产生不确定值。好的,因此我创建了一个单独的问题--