如何在c++中更改静态数组变量的地址
How to change address of a static array variable in C++?
假设我们已经定义了这样一个变量:
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++标准,但是一些(如果不是大多数)编译器允许您分配数据或代码最终所在的"节"(或类似的东西),然后您可以告诉链接器哪个地址。
相关文章:
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 静态数组的自由动态数组
- 如何在C++函数中声明静态 2D 数组?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 基于字节数组生成静态范围整数值
- 如何在C++中删除静态数组?
- 为什么 &a 和 c++ 中的静态数组相同?
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 将在堆栈上声明的元素添加到静态数组
- const_cast静态数组以添加恒常性
- C++访问静态 constexpr 数组
- 初始化类中的静态 const 数组 - C++
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 动态分配的数组和静态数组之间的区别
- 如何在 C++ 中使用 NULL(或 0)初始化静态字符数组
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以使用 constexpr 函数声明一个静态数组吗?
- 如何在静态函数中使用成员函数数组
- 具有大的2d数组:静态int与int