2015-10-30 4 views
0

у меня есть что-то вроде следующего:Использования 2D массив указателей приводит к ошибкам

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

Почему бы не просто использовать 'станд :: VECTOR' * et al * вместо того, чтобы повторно изобретать колесо? –

+0

Зачем создавать простой связанный список узлов, если у вас уже есть все в контейнере? Вы уже знаете, что «следующий» узел «points [a] [b]» будет «point [a] [b + 1]». –

ответ

3

Когда вы делаете points[i][j]->next, вы разыскиваете неинициализированный указатель, который ведет к undefined поведение.

Капля один уровень косвенности и сделать

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] и массив точек? Если точки [i] имеют 10 элементов, я хочу, чтобы каждый из них имел «следующий» в принципе. – 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; 
} 
Смежные вопросы