2016-02-14 3 views
1

Я определил на структуру выше main() под названием «Осколки»Как получить базовый адрес указателя на динамически выделенный объект

struct Pieces { 
    char *word; 
    int jump; 
} 

В моих main() у меня есть:

int main() { 
    Pieces *pieceptr; 
    readFile(preceptor); 

    cout << (*pieceptr).word << endl; //SEGFAULT occurs here 

    return 0; 
} 

И в readFile() у меня есть:

void readFile(Pieces *&pieceptr) { 

    ifstream fin; 
    fin.open("data"); 
    int pieceCount; 
    if(fin.is_open()) { 
     fin >> pieceCount; 

     pieceptr = new Pieces[pieceCount]; 

     for (int i = 0; i < pieceCount; i++) { 
      char *tempWord = new char[20]; 
      fin >> tempWord >> (*pieceptr).jump; 
      (*pieceptr).word = new char[stringLength(tempWord)]; 
      stringCopy((*pieceptr).word, tempWord); 
      delete []tempWord; 
      tempWord = NULL; 
      pieceptr++; 
     } 
    } else { 
     cout << "Error opening file." << endl; 
    } 
    fin.close(); 
} 

ограничения для этого проекта являются:

  • Создайте свои собственные строковые функции
  • Квадратные скобки должны использоваться только при объявлении или deallocating массив динамически.
  • Не используйте арифметику указателя, кроме ++ и - или вернитесь к домашнему указателю.
  • Не используйте стрелки (->) с указателями.

Я проверил функцию readFile() широко и функционирует, как я хочу, чтобы (он заполняет массив штук правильно), но после того, как я называю readFile() в main() мне нужно получить доступ к первому элементу массива снова. Поскольку код теперь, я получаю segfault из-за того, что указатель был увеличен за пределы массива. Как бы сбросить указатель, чтобы указать на первый элемент внутри массива без использования арифметики указателя?

+1

Сделайте копию указателя 'pieceptr' и увеличьте это значение при чтении. Невозможно «сбросить указатель»; вы можете уменьшить указатель на количество прочитанных вами элементов, но 'readFile' не возвращает эту информацию. –

+0

Вы, вероятно, не выделяете пространство для нулевого терминатора в 'new char [stringLength (tempWord)]' (предполагая, что 'stringLength()' ведет себя как 'strlen()'). –

+0

@MichaelBurr: Спасибо, но я должен был упомянуть, что мы не можем использовать -> нотацию в проекте. Я обновил сообщение. – w58

ответ

2

Несколько указателей могут указывать на одну и ту же точку памяти. Указатели также могут быть скопированы. Самое простое решение вашей проблемы - создать еще один указатель и все увеличивать его.

void readFile(Pieces *&pieceptr) { 

    ifstream fin; 
    fin.open("data"); 
    int pieceCount; 
    if(fin.is_open()) { 
     fin >> pieceCount; 

     pieceptr = new Pieces[pieceCount]; 
     Pieces* pieceIterator = pieceptr; 
     for (int i = 0; i < pieceCount; i++) { 
      char *tempWord = new char[20]; 
      fin >> tempWord >> (*pieceIterator).jump; 
      (*pieceIterator).word = new char[stringLength(tempWord)]; 
      stringCopy((*pieceIterator).word, tempWord); 
      delete []tempWord; 
      tempWord = NULL; 
      pieceIterator++; 
     } 
    } else { 
     cout << "Error opening file." << endl; 
    } 
    fin.close(); 
} 
+0

О, я не думал об этом. Сейчас все работает правильно. Спасибо за Ваш ответ. – w58

Смежные вопросы