【问题标题】:Why do I get a different value at run-time when type-casting a string to DWORD?为什么在将字符串类型转换为 DWORD 时在运行时会得到不同的值?
【发布时间】:2011-11-20 13:32:40
【问题描述】:
std::cout << (DWORD)"test";

如果我编译并运行它,我每次都会得到不同的输出值,但我不知道为什么。

有什么想法吗?

PS:我使用的是 Windows 7 64 位,并且正在使用 Microsoft Visual C++ 2010 Ultimate 进行编译。

【问题讨论】:

  • 您希望从中得到什么?
  • 这是一个愚蠢的做法,但一个有效的问题 - 看不到反对票的理由。
  • 我正在学习如何确定一个远程进程基地址,这可能是 "pinball.exe" 之类的东西——据我所知,它可以与偏移量一起使用(比如读取游戏分数)你会使用DWORD address = (DWORD)"pinball.exe" + offset;,其中offset可能是0xFC或其他类似的东西。
  • @DeadMG (如果您对 1 个代表的人投了反对票,然后删除了反对票,那么该人将被留在 3 个代表。不要告诉任何人。)
  • EnumProcessModulesEx() 就像找到远程进程的 proper 基地址的魅力。想我会在这里添加这个,以防其他人像我一样心不在焉的时候在这里绊倒。

标签: c++ casting dword


【解决方案1】:
std::cout << (DWORD)"test";

等价于:

const char *tmp = "test";
std::cout << (DWORD)tmp; 

也就是将地址转换成DWORD后打印出来:

如果你也这样做,它会打印相同的

std::cout << (const void*)"test";

【讨论】:

    【解决方案2】:

    “test”,在您的代码中,实际上是指向字符串开头的指针。当您将其转换为 DWORD 时,您将指针转换为整数类型,并写出该数字。

    由于存储“测试”的内存位置会随着每次运行而变化,因此您看到的值会发生变化。

    【讨论】:

    • 至于为什么字符串常量的地址(来自可执行文件的静态数据段)每次运行都会改变,这可能是由于address space layout randomization(ASLR)。
    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多