C++ Cout 在使用指针时崩溃

C++ Cout crashes when using pointer

本文关键字:指针 崩溃 Cout C++      更新时间:2023-10-16

我对C++很陌生,在开始时,我遇到了一个关于指针的令人沮丧的问题。请考虑以下代码:

#include <iostream>
using namespace std;
int main (){
int* mypointer;
*mypointer = 1;
cout << "Whats wrong";
}

它在运行时崩溃。我怀疑这与指针分配有关。但是在注释掉 cout 语句后,程序执行。通过将指针指定为

int* mypointer, myvar;
myvar = 1;
mypointer = &myvar;

程序运行,我可以将指针的值打印为:

cout << "value of pointer: " << *mypointer;

我得出的结论是,这将是指针的正确用法。

但是:为什么执行以下代码??:

#include <iostream>
#include <stdio.h>
using namespace std;
int main (){
int* mypointer;
*mypointer = 1;
printf("This works!n");
printf("I can even print the value mypointer is pointing to: %i",*mypointer);
}

简单地使用printf??我真的很感激大家的解释!

代码之所以执行,是因为您的编译器偶然设法优化了程序,以至于1被"硬编码"到printf调用中。

无论如何,它可能会这样做,使原始int和指针都无关紧要,但在这种情况下,它并没有反映指针已损坏并且没有原始int的事实。

因此,严格来说,这甚至不能反映程序的语义:正如您所发现的,为不存在的int赋值(通过未初始化或其他无效的指针)是无稽之谈,并导致未定义的行为

但这就是未定义行为的本质:任何事情都可能发生!编译器的作者正在充分利用这一点,他们意识到他们不必编写任何代码来使这种情况在逻辑上工作。因为是你违反了C++合同。:)