Печать значения int Pointer

Я работаю над этим, и я не могу заставить это работать должным образом. Я возвращаю последнее значение списка указателей, и я хотел бы его распечатать, но он печатает очень случайное число. Я предполагаю, что это адрес памяти указателя, но когда я разыменовываю его, мой вывод по-прежнему делает то же самое.

Мой список указателей — это список указателей, например: list<int*> pointerList

Например, это мой метод, возвращающий:

int* end() { return (pointerList.back()); }

Вот как я это называю.

int* totry = ca.end();
cout << *totry;

Это печатает адрес памяти, а не значение. У кого-нибудь есть идеи, как это решить?

Заранее спасибо!

РЕДАКТИРОВАТЬ: вот на что указывают указатели int: у меня есть список значений, таких как [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15], и у меня есть список указателей, которые указывают на разные части этого списка, например:

[0,4,8,12]

У меня есть код: int* end() { return (pointerList.back()); } в моем файле заголовка и вызов в моем файле .cpp:

int* totry = ca.end(); cout ‹‹ *попробовать;


Вот как я объявляю свой список указателей

    class ptrList
    {
    public:
        std::list<value_type> listOfValues;
        std::list<*int> pointerlist;

Я заполняю указатели списка внутри функции «добавить» и делаю это так:

int lstsqrt = 4;
for (int a = 1; a < lstsqrt; a++)
{
   int endptr = a + (int)lstsqrt;
    pointerlist.push_back((&*listOfValues.begin() + endptr)); //( (lstsqrt - 1) + a)  );

}

И это мой метод end()

int* end() {return (pointerlist.back());}

Затем это передается моей переменной toTry.


person SSS    schedule 11.02.2012    source источник
comment
На что указывает int* в вашем списке? Покажите нам больше кода, пожалуйста.   -  person Greg Hewgill    schedule 11.02.2012
comment
Как мы можем возможно узнать ответ на этот вопрос?   -  person Seth Carnegie    schedule 11.02.2012
comment
@Greg Hewgill Извините, я добавил еще немного кода, чтобы показать, на что указывают указатели int.   -  person SSS    schedule 11.02.2012
comment
Что такое pointerList и на что pointerList.back() возвращает указатель?   -  person Seth Carnegie    schedule 11.02.2012
comment
@SethCarnegie PointerList представляет собой список указателей int*, а pointerList.Back() возвращает указатель int* на переменную toTry, которая вызывает метод .end().   -  person SSS    schedule 11.02.2012
comment
Может быть, у вас есть дикий указатель?   -  person Ben Voigt    schedule 11.02.2012
comment
Как функция может вернуть указатель на переменную, которой инициализируется возвращаемое значение функции, без передачи переменной?   -  person Seth Carnegie    schedule 11.02.2012
comment
@SethCarnegie end() не принимает параметр.   -  person SSS    schedule 11.02.2012
comment
@SSS да, в том-то и дело. Таким образом, он не может вернуть указатель на totry, как вы сказали, потому что totry просто появляется при вызове функции.   -  person Seth Carnegie    schedule 11.02.2012
comment
@SethCarnegie Так ты говоришь, что я должен это сделать? 'int* попробовать ; totry = ca.end(); cout ‹‹ *totry;'   -  person SSS    schedule 11.02.2012
comment
Нет, вы должны показать нам код функции pointerList.back   -  person Seth Carnegie    schedule 11.02.2012
comment
@GregHewgill Смотрите новые изменения, которые я сделал. Я добавил гораздо больше кода, и это практически все.   -  person SSS    schedule 11.02.2012
comment
@SethCarnegie метод PointerList.Back() - это метод .back() стандартной библиотеки для списка   -  person SSS    schedule 11.02.2012


Ответы (1)


Одной из проблем, вероятно, будет эта строка:

pointerlist.push_back((&*listOfValues.begin() + endptr));

Ваш listOfValues является std::list, поэтому его значения не хранятся в непрерывном блоке памяти. Итак, вы получаете итератор для первого элемента с listOfValues.begin(), разыменовываете итератор с *, берете адрес этого с &, чтобы получить int*, затем добавляете какое-то значение, которое указывает куда-то в память, что вы не знаете, что это является.

Попробуйте сделать это вместо этого:

pointerlist.push_back((&*(listOfValues.begin() + endptr)));

где вы добавляете endptr к итератору (чтобы продвигать его по списку), затем разыменовываете и берете адрес. На самом деле вам может понадобиться использовать advance вместо +.

person Greg Hewgill    schedule 11.02.2012
comment
итератор std::list не является произвольным доступом, не так ли? Так что он не будет поддерживать operator+(iterator, offset) - person Ben Voigt; 11.02.2012
comment
@BenVoigt: я никогда не могу вспомнить (мой компилятор сообщает мне, когда мне нужно знать!), поэтому я добавил примечание о advance, которое займет линейное время, но выполнит эквивалентную операцию. - person Greg Hewgill; 11.02.2012
comment
@GregHewgill Я только что попробовал это, но, должно быть, я неправильно это реализую. Я получаю сообщение об ошибке Illegal Indirection и & требует I-Value Вот как я это реализую: listOfPointers.push_back(&*(advance(listOfValues.begin(), endptr)) ) - person SSS; 11.02.2012
comment
Взгляните на ссылку для advance (я связался с ней). Она не возвращает расширенный итератор, а является функцией void, которая изменяет свой первый аргумент. Итак, вам понадобится что-то вроде: std::list<value_type>::iterator i = listOfValues.begin(); advance(i, endptr); pointerlist.push_back(&*i); - person Greg Hewgill; 11.02.2012
comment
@GregHewgill Спасибо миллион миллиардов! Я сделал, как вы предложили, и это сработало. Единственное дополнительное изменение, внесенное в мой код, заключается в том, что мне пришлось выполнить вычитание -1 из моего endptr, потому что я выходил за пределы конца и получал AssertionError, что итератор списка не может быть разыменован. Я ценю помощь! - person SSS; 11.02.2012