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

时间:2013-03-26 09:04:19

标签: c++

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

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

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

// &myVar should be != 0x100

4 个答案:

答案 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 ++标准之外,但是一些(如果不是大多数)编译器允许您分配数据或代码最终的“部分”(或类似的东西),然后您可以告诉链接器什么地址。

但这可能不是视觉工作室编译中发生的事情而不需要付出很多努力。