访问指针数组中的元素

时间:2016-02-01 19:12:08

标签: c++ arrays pointers segmentation-fault

我在访问指针数组元素时遇到问题。我会尽可能地减少课程。这是处理我的代码中所有类型数据的头文件的一部分,然后是源文件。关于这些classese的一点点。所有这些都是从Data类派生的。 class2派生自class1,class3是class2的集合(数组)。

class class1
{
  public:
    class1(const char * S ) : Value(v), v(S)   {}
    class1(const class1 &S) : Value(v), v(S.v) {}
    Str &Value;
  private:
    Str v;
};

class class2 : public class1
{
  public:
    class2( const char * N, const char * V) : class1(V), n(N) {}

  protected:
    Str n;
};

class class3;
{
  public:
    class3 (                               ) {datum = 0;}
    class3 (const class3 &D                ) {set(D) ;}
    class3 (const class2 &S                ) {datum = 0; *this+= S;}
    class3 (const char * nm, const char * v) {datum =0; *this+=class2(nm,v);}

    class2 & operator [] = (const char *N);
    Data & operator += (const Data & D);
    operator class2 * () {return datum? *datum : 0}
    operator class2 **() {return datum? datum : 0}

  protected:
    class2 ** datum;
    class3 & set (const class3 &D);
};

这是源文件的一部分。

class3 & class3:: set (const class3 &S)
{
  int ents = S.Strs ();  // How many elements in array
  datum = new StrDatum * [ents + 1];

  int i;
  for (i = 0; i < ents; i++)
  {
    datum[i] = new StrDatum (*S.datum[i]);
  }
  datum[i] = 0;
  return *this;
} 
Data & class3::Operator += (const Data & D) // Data is the base class for all data-type classes
{
  if (D.Is (class2Dtype)) // dataType enum {class2Dtype = 2; class3Dtype = 3; etc... }
  {
    int ents = this->Strs();
    class 2 ** tmp = new class2 * [ents +1];

    int i;

    for (i=0; i < ents; i++)
    {
      tmp[i] = datum[i];
    }
    tmp[i++] = (class2 *) MakeMe (D); // Create a class2 instance
    tmp[i] = 0;
    delete [] datum;
    datum = tmp;
  }
  return *this;
}

确定。我已经创建了阵列,我试图访问它。我能够访问第一个元素,但是当我尝试访问第二个元素时,我遇到了分段错误。

// I create an instance of recordScreen where the array of pointer is created.
// This class has a method called GetData which retrieves the array
// In recordScreen.h
//   class2 & GetData(void);

recordScreen recSc; 
recSc.run();          // The array is created

// If want to see the first element value
Str data = ((class2 *)recSc.GetData())[0].Value; // This works fine.

//But when I try:
Str data2 = ((class2 *)recSc.GetData())[1].Value; // Segmentation Fault

// I check how many elements it has.
class3 test = recSc.GetData();
cout << "Elements = " << test.Strs() << endl; // Output = 2
是的,我没有写过这些课程,但我试图弄清楚它们是如何工作的。如果我还应该添加其他内容,请告诉我们。

1 个答案:

答案 0 :(得分:0)

您好我刚刚找到了一种访问数组元素的方法。这比我想象的容易得多。

recordScreen recSc; 
recSc.run();          // The array is created

class2 ** item;
item = recSc.GetData();

cout << item[0]->Value << endl; // First element
cout << item[1]->Value << endl; // Second element