打印 int 指针的值

4
我是一名有用的助手,可以为您翻译文本。

我一直在做这个,但似乎无法正常工作。我正在返回指针列表的最后一个值,并希望打印它,但它打印出一个非常随机的数字。我认为这是指针的内存地址,但当我取消引用它时,我的输出仍然是相同的。

我的Pointerlist是指针列表,例如:list<int*> pointerList

例如,这是我的方法返回:

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

这就是我调用它的方式。

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

这里打印的是内存地址而不是值。有没有人有解决这个问题的想法?
提前感谢!
编辑: 这是整数指针所指向的内容: 我有一个值列表,例如 [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 << *totry;


这是我声明指针列表的方式

    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变量。


你的列表中的 int* 指向哪里?请展示更多的代码。 - Greg Hewgill
@SethCarnegie PointerList是一个int指针的列表,pointerList.Back()返回的是调用.end()方法的"toTry"变量的int指针。 - SSS
一个函数如何返回一个指向变量的指针,而不需要传递该变量作为参数来进行初始化? - Seth Carnegie
@SethCarnegie end()不接受参数。 - SSS
@SSS 是的,这就是关键所在。因此它不能像你说的那样返回指向 totry 的指针,因为当函数被调用时,totry 才刚刚出现。 - Seth Carnegie
显示剩余8条评论
1个回答

6

可能存在的一个问题是这行代码:

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

你的 listOfValues 是一个 std::list,因此它的值不是存储在连续的内存块中。所以,当你使用 listOfValues.begin() 获取第一个元素的迭代器时,通过 * 对迭代器进行解引用,再通过 & 取得一个 int* 的地址,然后加上一些值,指向内存中你不知道是什么的位置。

尝试改成这样:

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

您需要将endptr添加到迭代器中(以沿着列表前进),然后对其进行取消引用并获取地址。实际上,您可能需要使用advance而不是+


一个std::list的迭代器不是随机访问的,对吧?所以它不支持operator+(iterator, offset) - Ben Voigt
@BenVoigt:我总是记不住(当我需要知道时,我的编译器会告诉我!),所以我添加了一个关于“advance”的注释,它将花费线性时间但执行等效操作。 - Greg Hewgill
@GregHewgill 我刚试了一下,但我可能没有正确实现它。我收到了“非法间接”错误,并且“&”需要I-Value。这是我的实现方式: listOfPointers.push_back(&*(advance(listOfValues.begin(), endptr)) ) - SSS
请查看advance的参考文献(我已经链接到它)。它不会返回高级迭代器,而是一个void函数,它修改其第一个参数。因此,您需要像这样的东西:std::list<value_type>::iterator i = listOfValues.begin(); advance(i, endptr); pointerlist.push_back(&*i); - Greg Hewgill
@GregHewgill 非常感谢您!我按照您的建议操作了,很有效。仅对我的代码做了一个额外的编辑,即我不得不对我的endptr进行-1减法运算,因为我超出了结尾,导致AssertionError:List Iterator was not dereferencable。非常感谢您的帮助! - SSS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接