【发布时间】:2011-11-22 02:58:12
【问题描述】:
class app {
public int x = 3;
static void Main(string[] args)
{
}
}
可以得到x变量分配的内存地址吗?
示例可以在C、C++、C# 或D 中。
我希望很清楚
提前致谢
【问题讨论】:
class app {
public int x = 3;
static void Main(string[] args)
{
}
}
可以得到x变量分配的内存地址吗?
示例可以在C、C++、C# 或D 中。
我希望很清楚
提前致谢
【问题讨论】:
与号 (&) 是大多数类 C 语言中的“地址”运算符:
int x;
printf("Address of x is %p\n", &x);
& 的返回值实际上是其操作数的 pointer。
【讨论】:
在 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.
【讨论】:
跳过 D 和 E。C# 和 F#(以及其他 CLR 语言) - 通常任何特定变量都没有固定地址。可以使用托管调试器(即 WinDbg + SOS)来查找任何特定变量的地址,或者使用 fixed 以及互操作类。
【讨论】:
fixed 仅在变量驻留在 托管 堆上时才需要。在互操作场景中,您还拥有原生 Win32 堆,其上的所有变量都是固定的。