将自己的地址放入变量中
Posted
技术标签:
【中文标题】将自己的地址放入变量中【英文标题】:Putting own address in variable 【发布时间】:2015-04-21 18:14:25 【问题描述】:int main()
int x;
x = int(&x);
int* q;
q = &x;
int* p;
p = (int*)&x;
int* w;
w = (int*)x;
cout << *p << endl << x << endl << *q << endl << *w << endl << p << endl << q << endl << w << endl << &x;
return 0;
输出:
5762632 5762632 5762632 5762632 0057EE48 0057EE48 0057EE48 0057EE48
这一步x = int(&x)
有效吗?这在概念上有什么问题吗?
当我们写p = (int*)&x
和w = (int*)x
时如何可视化/解释发生了什么?
还请注意,该程序仅在编写步骤 1 时执行。如果x
不包含自己的地址,那么程序会报错。
【问题讨论】:
不,当int
小于指针时这是无效的。
是的。那么第二个问题呢?
【参考方案1】:
这一步 x = int(&x) 有效吗? 这在概念上有什么问题吗?
该语句可能有效并且可能引发未定义的行为。一切都取决于平台。
在我使用过的许多平台上,地址从未签名。它们总是unsigned
,因为需要符号位来表示完整的地址范围。换句话说,我建议:
无符号整数 x = (无符号整数) &x;
同样是关于符号位以及地址的表示方式。
当我们编写 p = (int*)&x 和 w = (int*)x 时,如何可视化/解释会发生什么?
如果你想打印一个地址,我建议你使用指针格式:
cout << ((void *) &x) << endl;
或
printf("%p\n", &x);
我建议使用 调试器 而不是打印地址。调试器允许您检查指针中的值。但有时打印信息是一种更好的方法(例如在处理多个任务或多个处理器时)。
【讨论】:
以上是关于将自己的地址放入变量中的主要内容,如果未能解决你的问题,请参考以下文章