使用指针时C ++ Cout崩溃

时间:2017-04-26 12:24:17

标签: c++

我对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 个答案:

答案 0 :(得分:2)

代码执行是因为,只是偶然的,您的编译器已经设法优化程序,使1被“硬编码”到printf调用中。

无论如何它可能会这样做,使原始int和指针无关,但在这种情况下它并没有反映出指针被破坏并且不是原件int

所以,严格地说,这甚至没有反映程序的语义:正如你所发现的那样,为一个不存在的int赋值(通过未初始化或其他无效指针)是无稽之谈,导致未定义的行为

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