【问题标题】:how to find allocated memory by a variable?如何通过变量查找分配的内存?
【发布时间】:2011-11-22 02:58:12
【问题描述】:
class app {
        public int x = 3; 

        static void Main(string[] args)
        {
        }
}

可以得到x变量分配的内存地址吗?

示例可以在CC++C#D 中。 我希望很清楚 提前致谢

【问题讨论】:

    标签: c# c++ c windows


    【解决方案1】:

    与号 (&) 是大多数类 C 语言中的“地址”运算符:

    int x;
    printf("Address of x is %p\n", &x);
    

    & 的返回值实际上是其操作数的 pointer

    【讨论】:

    • 有人反对更详细一点吗?我的回答没有错。
    【解决方案2】:

    在 C 和 C++ 中,这是相当简单的。我将在 C++ 中给出示例:

    struct App
    {
       int x;
       App() : x(3) { }
    };
    
    int main()
    {
      App a;
      int * p = &a.x; // address goes here
    }
    

    当然没有“变量App::x”这样的东西,因为App 只是类型。这种类型的每个instance,例如示例中的a,都带有自己的一组成员变量,并且很容易获得指向该成员变量的指针。 (C 中的普通数据结构也是如此。)

    请注意,C++ 有另一个相关的特性:成员指针。这允许我们形成不透明的值int App::*pm = &App::x,它本身并不指向任何东西,如果你愿意的话,它只携带关于类内App::x偏移 的信息。该动物可以与实例一起使用来获取实际值,例如a.*pm.

    【讨论】:

      【解决方案3】:

      跳过 D 和 E。C# 和 F#(以及其他 CLR 语言) - 通常任何特定变量都没有固定地址。可以使用托管调试器(即 WinDbg + SOS)来查找任何特定变量的地址,或者使用 fixed 以及互操作类。

      【讨论】:

      • 补充:fixed 仅在变量驻留在堆上时才需要。做一个 int i = 0; int* pi = &i;在不安全的代码中完全有效
      • 进一步补充:fixed 仅在变量驻留在 托管 堆上时才需要。在互操作场景中,您还拥有原生 Win32 堆,其上的所有变量都是固定的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多