Я определил на структуру выше 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 из-за того, что указатель был увеличен за пределы массива. Как бы сбросить указатель, чтобы указать на первый элемент внутри массива без использования арифметики указателя?
Сделайте копию указателя 'pieceptr' и увеличьте это значение при чтении. Невозможно «сбросить указатель»; вы можете уменьшить указатель на количество прочитанных вами элементов, но 'readFile' не возвращает эту информацию. –
Вы, вероятно, не выделяете пространство для нулевого терминатора в 'new char [stringLength (tempWord)]' (предполагая, что 'stringLength()' ведет себя как 'strlen()'). –
@MichaelBurr: Спасибо, но я должен был упомянуть, что мы не можем использовать -> нотацию в проекте. Я обновил сообщение. – w58