如何在c++中更改静态数组变量的地址

How to change address of a static array variable in C++?

本文关键字:数组 静态 变量 地址 c++      更新时间:2023-10-16

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

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

是否可以改变它的地址而不触及它的声明?
更明确地说,我不想把它声明为指针。

// &myVar should be != 0x100

在评论中你说:

嗯,我问这个问题是因为当我在调试一个c++程序时,我看到visual studio在运行时用&myVar

显示不同的地址

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

修改如下:

  • .h文件中将变量声明为extern而不是static:

     //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;
  • 调试器没有正确显示地址

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

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

但这可能不是在没有很多努力的visual studio编译中发生的事情。