【问题标题】:confusion on myClass ** p1 and myClass *p2[5]myClass ** p1 和 myClass *p2[5] 的混淆
【发布时间】:2015-03-15 19:24:55
【问题描述】:

我有以下代码

#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;
   }
  1. 为什么调用p1的构造函数后会出现分段错误?
  2. 如果注释掉*p1 = new myClass;行,打印“PP7myClass”和“A5_P7myClass”,“PP7”和“A5_P7”是什么?
  3. 如果我定义一个函数void func(myClass a, myClass b){},然后执行func(p1, p2);,编译器会报错不能将myClass ** 转换为myClass,这意味着p1p2 都是输入myClass **,但是为什么return 0;上面的两行没有打印出来?

【问题讨论】:

  • *p1 是一个未初始化的指针,你正在通过写入它来破坏随机内存。

标签: c++


【解决方案1】:
  1. p1 本身实际上并不指向某物。所以*p1 取消引用未初始化的内存

  2. 它们是类型的名称错位名称,由编译器构造。见http://en.wikipedia.org/wiki/Name_mangling

  3. 我没有看到您的代码中定义/声明的 pc 变量或类型。 编辑 因为f() 的原型调用需要传递myClass 类型的参数。 p2 也是 myClass** 类型;它是指向myClass 的指针数组的名称,并退化为类型myClass**,参见standard conversions: Array-to-pointer conversion

【讨论】:

  • 3,我的错,刚刚改了。
  • 1.如果我做myClass * p1; p1 = new myClass;,这很好用。 3.我理解数组到指针的退化,但没有意识到这是在数组传递到函数体内之前发生的。
【解决方案2】:

为什么调用p1的构造函数后会出现分段错误?

myClass ** p1;

说“给指针空间”;而不是“在这个未初始化的指针指向的地方也给我空间”。

    2.

它们是 typeid。

3.

您没有将 pcp 初始化为某种东西:我想知道为什么您的编译器不会阻止您这样做,但似乎 pc 既没有 p 的类型,也没有 @987654326 的类型@。

编辑:

编辑后:指针和数组的 typeid 不同。

【讨论】:

  • 2. “它们是 typeid”是什么意思?
  • "PP7" 和 "A5_P7" 是 typeids。
猜你喜欢
  • 2014-10-11
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多