【问题标题】:Get actual address of variable in memory [closed]获取内存中变量的实际地址[关闭]
【发布时间】:2017-04-25 17:29:28
【问题描述】:

我使用这样的数组 multiset::iterator it[100] 当我这样做时:it[0] = mymultiset.insert(15) 然后 it[1] = mymultiset.insert(17) 我得到相同的地址,例如 00C0E960(使用 %p)或 12642656(使用 %d)。 我的问题是,我需要实际地址而不是这个...用于与另一个迭代器进行比较。

伪代码:

multiset<int> a;
multiset<int>::iterator x1, x2;
multiset<int>::iterator it[10000];
int j = 0
it[j] = a.insert(15);
x1 = x2 = it[j];
j++;
it[j] = a.insert(74);
x1 = it[j];
printf("Value: %d, addressP: %p, addressD: %d\n", *it[0], it[0], it[0]);
printf("Value: %d, addressP: %p, addressD: %d\n", *x1, x1, x1);
printf("Value: %d, addressP: %p, addressD: %d\n", *it[1], it[1], it[1]);
printf("Value: %d, addressP: %p, addressD: %d\n", *x2, x2, x2);

输出:

Value: 15, addressP: 00BDF0F0, addressD: 12447984
Value: 15, addressP: 00BDF0F0, addressD: 12447984
Value: 74, addressP: 00BDF0F0, addressD: 12447984
Value: 74, addressP: 00BDF0F0, addressD: 12447984

怎么了?

【问题讨论】:

  • 也许你应该在尝试打印它们的地址时使用&amp; 获取迭代器对象的地址。我不确定将迭代器打印为地址会做什么,我怀疑它没有定义。
  • 听起来像是 XY 问题。你想用这个解决什么问题?
  • 您的printf 调用具有三个转换说明符,但只有两个参数。 %p 转换说明符需要 void * 类型的参数; printf 使用的可变参数函数调用机制无法确保将参数转换为这种类型。
  • 打开你的编译器警告。编译器会告诉你至少两个不同的地方是错误的。

标签: c++ memory


【解决方案1】:

printf() 有三个格式说明符,只有两个参数,所以打印的第三个值是未定义的。

要查看值的地址,您需要一个 * 来取消引用,然后一个 &amp; 来获取地址。

这是一个修复的例子:

printf("Value: %d, iterator pointer addr: %p, value address: %d\n", *x1, x1, &(*x1));

【讨论】:

  • 我编辑我的帖子以更正它(它不是我的代码的副本(只是输出的值),因此是那个错误),但是真的,&(*x1) 为每个插入返回不同的数字,所以它的外观,可以提供帮助
  • 有人对此投了反对票。答案有问题吗?如果有请告诉我
  • 我认为,这个网站的投票系统真的很疯狂,谁只是对好的答案投了反对票,至少没有用 clearify 发表评论,他为什么要这样做。我创建了这个问题,所以如果答案帮助我解决了我的问题,我认为这是一个很好的答案。谁使用这个答案并没有解决他们的问题,首先应该好好阅读这个问题,如果包含他们需要的东西......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
相关资源
最近更新 更多