我对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 ??我非常感谢你们的解释!
答案 0 :(得分:2)
代码执行是因为,只是偶然的,您的编译器已经设法优化程序,使1
被“硬编码”到printf
调用中。
无论如何它可能会这样做,使原始int
和指针无关,但在这种情况下它并没有反映出指针被破坏并且不是原件int
。
所以,严格地说,这甚至没有反映程序的语义:正如你所发现的那样,为一个不存在的int
赋值(通过未初始化或其他无效指针)是无稽之谈,导致未定义的行为。
但这是未定义行为的本质:任何事情都可能发生!您的编译器的作者正在充分利用它,通过意识到他们不必编写任何代码来使该案例在逻辑上起作用。因为是你违反了C ++合同。 :)