我有以下代码
#include <iostream>
#include <typeinfo>
using namespace std;
class myClass{
public:
myClass(){
cout<<"constructor called..."<<endl; }
};
int main(){
myClass ** p1;
myClass *p2[5];
*(p2+4) = new myClass;
*p1 = new myClass; // "constructor called..." printed, but segmentation fault
cout<<typeid(p1).name()<<endl;
// "PP7myClass" printed, after commenting out *p1 = new myClass;
// what is PP7?
cout<<typeid(2).name()<<endl;
// "A5_P7myClass" printed, after commenting out *p1 = new myClass;
// what is A5_P7?
if(typeid(p1)==typeid(p2)) cout<<"==="<<endl;
if(typeid(p1)==typeid(*p2)) cout<<"&&&"<<endl;
// I expected at least one of the above cout
// two lines should be printed, but nothing printed actually, why?
return 0;
}
- 为什么调用
p1
的构造函数后出现段错误? - 如果行
*p1 = new myClass;
被注释掉,打印“PP7myClass”和“A5_P7myClass”,那么“PP7”和“A5_P7”是什么? - 如果我定义一个函数
void func(myClass a, myClass b){}
然后执行func(p1, p2);
,编译器会报错不将两个参数的myClass **
转换为myClass
,这意味着p1
和p2
都是类型myClass **
,但是为什么上面两行return 0;
没有打印出来呢?
最佳答案
p1
本身实际上并不指向某物。所以*p1
解引用未初始化的内存它们是由编译器构造的类型的名称修饰名称。参见 http://en.wikipedia.org/wiki/Name_mangling
我没有在您的代码中看到定义/声明的
pc
变量或类型。 编辑 因为f()
的原型(prototype)要求传递myClass
类型的参数。p2
也是myClass**
类型;它是指向myClass
的指针数组的名称,并退化为myClass**
类型,参见 standard conversions: Array-to-pointer conversion
关于c++ - 混淆 myClass ** p1 和 myClass *p2[5],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29065142/