我们假设我们已经定义了一个这样的变量:
static struct array myVar;
// &myVar is 0x100
是否可以在不触及声明的情况下更改地址? 太清楚我不想将它声明为指针。
// &myVar should be != 0x100
答案 0 :(得分:3)
你在评论中说:
好吧,我问这个是因为在我调试C ++程序时,我看到visual studio在运行时用& myVar显示不同的地址
如果您已在 .h 文件中声明myVar
,而该文件已包含在多个 .cpp 文件中,则在每个 .cpp 文件,您将看到myVar
的不同地址。这是因为myVar
具有内部链接,因为它被声明为static
。内部链接意味着每个翻译单元( .cpp 文件)将具有不同的变量定义。因此,如果有N .cpp 文件,则基本上有N个版本myVar
,每个版本具有不同的地址。这是一个可能的解释!
解决方法是:
在extern
文件中将变量声明为static
而不是.h
:
//file.h
extern struct array myVar; //it is just a declaration
然后在一个.cpp
文件中,定义它,不使用static
关键字:
//anyfile.cpp
struct array myVar; //it is a definition!
答案 1 :(得分:2)
不,在运行时无法更改myVar
的地址。
在程序的不同运行期间,我问这个是因为在我调试C ++程序时,我看到visual studio在运行时用
&myVar
显示不同的地址
myVar
可能会被分配不同的地址。
如果地址在同一次运行期间正在改变 ,那么两个最可能的解释是:
myVar
; 答案 2 :(得分:0)
编译程序时,编译器将符号myVar
替换为内存中的地址。与struct
或运行时一样,在使用new
- 运算符的动态内存时,所有地址都在编译时分配。因此无法更改变量的地址,如果可以的话,这将是灾难性的。
答案 3 :(得分:0)
它取决于您使用的编译器/链接器环境。这完全不在C或C ++标准之外,但是一些(如果不是大多数)编译器允许您分配数据或代码最终的“部分”(或类似的东西),然后您可以告诉链接器什么地址。
但这可能不是视觉工作室编译中发生的事情而不需要付出很多努力。