2015-10-30 39 views
0

我有类似的如下:使用指针的二维数组导致错误

template<class T> 
struct point{ 
    point* next = nullptr; 
    T* data = nullptr; 
} 

template<class T> 
class newClass 
{ 
    point<T>*** points; 

public: 
    newClass() 
    { 
     points = new point<T>**[10]; 
     for (int i = 0; i < 10; i++) 
      points[i] = new point<T>*[10]; 

     for (int i = 0; i < 10; i++) 
      for(int j = 0; j < 10; j++) 
      if(j != 9) 
       points[i][j]->next = points[i][j+1]; //ERROR 
    } 
}; 

有人可以帮助我明白为什么这会产生一个错误?我没有收到错误消息,该程序只是崩溃。

+7

请不要[三星级程序员(http://c2.com/cgi/wiki?ThreeStarProgrammer) – NathanOliver

+1

为什么不直接使用'的std :: VECTOR' *等*而不是重新发明轮子? –

+0

为什么当你已经把所有的节点都放在一个容器中的时候,建立一个简单的节点链表?你已经知道'points [a] [b]'的“next”节点将是'points [a] [b + 1]'。 –

回答

3

当你做points[i][j]->next你取消引用一个未初始化的指针,导致未定义的行为。间接的

降一个级别,并做

points[i][j].next = &points[i][j+1]; 

或者,做一个额外的分配环路初始化最后一个指针了。


对于不同的方式,你并不需要在所有这里使用指针,特别是因为你的分配都是一个固定的大小,这意味着你可以使用固定阵列,甚至更好的,std::array

std::array<std::array<point<T>, 10>, 10> points; 
0

类型表达的

points[i][j] 

point<T> *。该指针未初始化。它具有不确定的价值。首先你需要分配一个将被这个指针指向的对象。例如

points[i][j] = new point<t>(); 

否则这个

points[i][j]->next 

指行不通的。

我想你指的是以下

template<class T> 
class newClass 
{ 
    point<T> **points; 

public: 
    newClass() 
    { 
     points = new point<T>*[10]; 
     for (int i = 0; i < 10; i++) 
      points[i] = new point<T>[10](); 

     for (int i = 0; i < 9; i++) 
       points[i]->next = points[i+1]; 
    } 
}; 
+0

是不是积分[i]和点数?如果points [i]有10个元素,我希望他们每个人都有一个“next”。 – KalibiddJlddkO

+0

@KalibiddJlddkO对不起。我不明白你问了什么。你是否需要一个动态分配的类型为类型的对象的一维数组,或者是否需要一个动态分配的类型点为的对象的二维数组? –

0

你有太多的指针运算符。下面的代码将工作...

#include <iostream> 

using namespace std; 

template<class T> 
struct point { 
    point* next = nullptr; 
    T* data = nullptr; 
    T* operator->() { 
     return data; 
    } 
}; 

template<class T> 
class newClass 
{ 
    point<T>** points; 

public: 
    newClass() 
    { 
     points = new point<T>*[10]; 
     for (int i = 0; i < 10; i++) { 
      points[i] = new point<T>[10]; 
     } 

     for (int i = 0; i < 10; i++) { 
      for (int j = 0; j < 10; j++) { 
       if (j != 9) { 
        points[i][j].next = points[i][j + 1].next; //ERROR 
       } 
      } 
     } 
    } 
}; 

int main() 
{ 
    newClass<int> nc; 

    return 0; 
}