0

假设我们已经定义了一个像这样的变量:

static struct array myVar;
// &myVar is 0x100

是否可以在不触及其声明的情况下更改其地址?
太清楚了,我不想将它声明为指针。

// &myVar should be != 0x100
4

4 回答 4

3

在你说的评论中:

好吧,我问这个是因为在调试 C++ 程序时,我看到 Visual Studio 在运行时使用 &myVar 显示不同的地址

如果您已在包含在多个.cppmyVar文件中的.h文件中声明,那么在每个.cpp文件中您将看到不同的 .h 文件地址。这是因为它被声明为具有内部链接。内部链接意味着每个翻译单元(.cpp文件)将有不同的变量定义。因此,如果有 N 个.cpp文件,则基本上每个文件都有 N 个不同地址的版本。这是一种可能的解释!myVarmyVarstaticmyVar

修复是这样的:

  • 将变量声明为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!
    
于 2013-03-26T09:10:07.673 回答
2

myVar不,不能在运行时更改地址。

我问这个是因为在调试 C++ 程序时,我看到 Visual Studio 在运行时显示不同的地址&myVar

myVar在程序的不同运行期间很可能会被分配不同的地址。

如果地址在同一次运行中发生变化,最可能的两种解释是:

  • 你有不止一个myVar
  • 调试器未正确显示地址。
于 2013-03-26T09:05:09.670 回答
0

它确实取决于您使用的编译器/链接器环境。这将完全超出 C 或 C++ 标准,但一些(如果不是大多数)编译器允许您分配数据或代码最终所在的“部分”(或类似的东西),然后您可以告诉链接器什么地址.

但这可能不是在 Visual Studio 编译中发生的事情,而无需付出很多努力。

于 2013-03-26T09:13:38.063 回答
0

编译程序时,编译器会将符号替换为myVar内存中的地址。所有地址都是在编译时分配的,比如你的,struct或者在运行时,当使用new-operator 使用动态内存时。所以不可能改变变量的地址,如果你能做到,那将是灾难性的。

于 2013-03-26T09:09:10.090 回答