C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?

C++ - what type of storage duration do local pointer variables in a function have and where are they stored?

本文关键字:存储 持续时间 类型 在哪里 函数 局部 指针 C++ 变量 什么      更新时间:2023-10-16

我正在从存储持续时间中查找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 ++比赛。

相关文章: