C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
C++ - what type of storage duration do local pointer variables in a function have and where are they stored?
我正在从存储持续时间中查找C++存储持续时间的类型。
我只是想知道函数中的局部指针变量具有哪种类型的存储持续时间,因为函数中的非静态局部变量将在块结束时被定性。但这不适用于指针(在这种情况下xPtr
)。在程序结束之前,它们仍将存在,尽管我们不能再次触摸它。
自动 存储持续时间。对象的存储在封闭代码块的开头分配并解除分配 在最后。所有本地对象都具有此存储持续时间,但那些除外 声明为静态、外部或thread_local。
静态 存储持续时间。对象的存储是在以下情况下分配的 程序开始并在程序结束时解除分配。只有一个 对象的实例存在。在命名空间范围内声明的所有对象 (包括全局命名空间)具有此存储持续时间,加上那些 用静态或外部声明。请参阅非局部变量和静态变量 局部变量,以获取有关使用此初始化对象的详细信息 存储持续时间。
我的另一个问题是,为什么系统分配了相同的内存地址0x00000041C69EF754
当它第二次进入函数时,xPtr
仍然指向临时变量x
。
void localPointer()
{
int x = 10;
static int* xPtr = &x; // 0x00000041C69EF754 - 0a 00 00 00 (data the address contains)
std::cout << "end of function" << std::endl;
}
int main()
{
// first enter
localPointer();
/*
the address 0x00000041C69EF754 and its value still
exsit out of the scope of the function localPointer
*/
std::cout << "-----------------------------------------" << std::endl;
// second enter
localPointer();
return 0;
}
指针也是一个普通的静态变量;它是使用 new 创建指针时是动态的指针的值。
在您的示例中,指针一直指向一个未更改的局部堆栈变量,因为当您输入函数时会重新创建相同的堆栈。
尝试从另一个级别调用此函数,以便 RSP 值更改并查看会发生什么。例如,创建另一个函数,然后从中调用此函数。
由于 x在堆栈上,因此 x 的地址是调用堆栈中的一个地址。 如果您在函数退出后尝试访问该地址,您可能会得到一些东西,但这可能不是您所期望的。 你有一个指针,它只是一个数字。 这并不意味着它是一个有效的地址。
如果从另一个函数调用localPointer
,则会看到它指向不同的数据:
void localPointer () {
int x = 7;
static int* ptr = &x;
std::cout << " ptr = " << ptr << ", *ptr = " << *ptr
<< ", x = " << x << ", &x = " << &x << std::endl;
}
void otherFunction() {
int y = 8;
std::cout << " &y = " << &y << std::endl;
localPointer();
}
int main()
{
localPointer();
otherFunction();
localPointer();
}
示例输出:
ptr = 0x7ffd8794f13c, *ptr = 7, x = 7, &x = 0x7ffd8794f13c
&y = 0x7ffd8794f13c
ptr = 0x7ffd8794f13c, *ptr = 8, x = 7, &x = 0x7ffd8794f11c
ptr = 0x7ffd8794f13c, *ptr = 7, x = 7, &x = 0x7ffd8794f13c
static 关键字表示此变量仅在第一次调用函数时初始化一次,并且在程序持续时间内持续存在,或者除非您显式更改它。
我想你可能想澄清你想知道的是什么。 将局部变量的地址存储在静态中并不是一个非常标准的做法 - 除非您试图赢得混淆的C ++比赛。
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 静态存储持续时间初始化
- 在不同翻译单元中具有静态存储持续时间的依赖非局部常量浮点变量的常量初始化
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- 什么是静态存储持续时间的临时对象
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)
- C++中结构的存储持续时间和成员初始化
- 带有动态存储持续时间的lambda
- 成员子对象继承存储持续时间是否有任何非直观的副作用
- 具有自动存储持续时间的虚拟功能似乎不起作用
- C 静态与线程存储持续时间破坏顺序
- 在销毁任何具有自动存储持续时间的对象之前调用的回调
- 具有静态存储持续时间的对象的C++级联破坏
- 编译时方法,用于确定对象是否具有自动存储持续时间
- 是块作用域静态或线程存储持续时间变量初始化失败的原因
- 引用类型和存储持续时间
- ' const int a = 1; '是' a '一个常量表达式,如果' a '具有自动存储持续时间
- 声明一个结构并立即用cv限定符或存储持续时间说明符对其进行实例化