C++ 键入指向int的指针会崩溃

C++ 键入指向int的指针会崩溃,c++,C++,我曾经认为两个cout语句指向相同的值,即使其中一个以十六进制打印,另一个以整数格式打印。 但是今天我在g++上运行了同样的程序,发现第二条语句崩溃了 int i1=12; int *p1=&i1; cout<<*(*((int***)&p1)); cout<<"\n\n "; //is same cout<<*(int*)*(int*)&p1; cout<<"\n "; //is

我曾经认为两个cout语句指向相同的值,即使其中一个以十六进制打印,另一个以整数格式打印。 但是今天我在g++上运行了同样的程序,发现第二条语句崩溃了

int i1=12;
int *p1=&i1;

cout<<*(*((int***)&p1)); cout<<"\n\n           "; //is same
cout<<*(int*)*(int*)&p1; cout<<"\n           "; //is same
inti1=12;
int*p1=&i1;

cout你不能假装指针和整数是这样的。您的代码对类型宽度和对齐方式做了大量假设,使用错误的类型对内容进行别名,然后取消引用。所有这些都有未定义的行为。如果它在你“幸运”之前“起作用”


只要把它扔掉,写出一些对C++语言的语义有意义的东西。

你的假设是错误的,一个普通的编译器警告你:

main.cpp: In function 'int main()':
main.cpp:10:32: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
     std::cout<< *(int*)*(int*)&p1 <<std::endl;
在我的32位机器上,两个值都是相同的。在您的机器上,如果是64位,您将看到不同的值!并且第一个值不再指向有效地址。而且在我的32位机器上,编译器会警告指针的错误使用。永远不要忽略编译器警告

在我的32位机器上,您编写的代码也可以正常工作,但它是未定义的行为,还会导致编译器警告


希望对您有所帮助:-)

您能提供更多信息吗?这是编译器错误吗?错误消息是什么?它是一个核心转储(分段错误)。编译得很好。你为什么要尝试这个怪物?你想解决什么问题?我们需要更多asterisks@GillBates
********************************************************************
:-)然后不需要强制转换。就像其他大部分代码一样。完整的代码是无用的:-)但是如果有人想了解基本知识。。。为什么不呢?这些不是“C++的基础知识”。它们是一些没有现实根据的武断小说的基础。这有什么意义?你不应该问我,而是问OP,因为这样的问题。。。我个人根本不需要演员体操。而要打印“12”我没有必要做这样神秘的事情:-)你问了我一个问题;我回答!我对问OP没什么兴趣,因为我觉得我们不喜欢这个答案。我正试图确切地理解你所说的是错的。因此,这个问题:)。我的意图不是写一个代码来做一些有意义的事情,而是左右尝试,以了解什么是有效的,什么是无效的,哪种imo是最好的学习方式(无论是音乐还是语言)。你不必详细解释我,如果你能帮我解决一些你认为可以澄清我脑海中疑虑的话题,那么我会非常高兴和感谢你。@anurag86:只是不要用没有意义的指针做奇怪的事情。不要假装
int*
int**
int***
甚至是
int
。事实并非如此。它是一个
int*
。这就是我要说的!
 std::cout<< *(int*)*(int**)&p1 <<std::endl;
int i1=12;
int *p1=&i1;

std::cout << (int*)*(int*)&p1 << std::endl;
std::cout << (int*)*(int**)&p1 << std::endl;