假设我们已经定义了一个像这样的变量:
static struct array myVar;
// &myVar is 0x100
是否可以在不触及其声明的情况下更改其地址?
太清楚了,我不想将它声明为指针。
// &myVar should be != 0x100
假设我们已经定义了一个像这样的变量:
static struct array myVar;
// &myVar is 0x100
是否可以在不触及其声明的情况下更改其地址?
太清楚了,我不想将它声明为指针。
// &myVar should be != 0x100
在你说的评论中:
好吧,我问这个是因为在调试 C++ 程序时,我看到 Visual Studio 在运行时使用 &myVar 显示不同的地址
如果您已在包含在多个.cppmyVar
文件中的.h文件中声明,那么在每个.cpp文件中您将看到不同的 .h 文件地址。这是因为它被声明为具有内部链接。内部链接意味着每个翻译单元(.cpp文件)将有不同的变量定义。因此,如果有 N 个.cpp文件,则基本上每个文件都有 N 个不同地址的版本。这是一种可能的解释!myVar
myVar
static
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!
myVar
不,不能在运行时更改地址。
我问这个是因为在调试 C++ 程序时,我看到 Visual Studio 在运行时显示不同的地址
&myVar
myVar
在程序的不同运行期间很可能会被分配不同的地址。
如果地址在同一次运行中发生变化,最可能的两种解释是:
myVar
;它确实取决于您使用的编译器/链接器环境。这将完全超出 C 或 C++ 标准,但一些(如果不是大多数)编译器允许您分配数据或代码最终所在的“部分”(或类似的东西),然后您可以告诉链接器什么地址.
但这可能不是在 Visual Studio 编译中发生的事情,而无需付出很多努力。
编译程序时,编译器会将符号替换为myVar
内存中的地址。所有地址都是在编译时分配的,比如你的,struct
或者在运行时,当使用new
-operator 使用动态内存时。所以不可能改变变量的地址,如果你能做到,那将是灾难性的。