在定义它的函数之外操作局部静态指针变量
Manipulate a local static pointer variable outside the function where it is defined
我想在全局范围内访问和修改函数中定义的静态变量,但是输出的第2行和第3行是意外的,为什么ox是0?
#include <iostream>
using namespace std;
int * foo(){
static int *x = new int(5);
cout << *x << '\t' << &x << endl;
*x++;
return x;
}
int main(){
int * ox;
ox = foo();
cout << *ox << '\t' << &ox << endl;
*ox++;
cout << *ox << '\t' << &ox << endl;
int * t= foo();
}
输出是(在我的机器上):
5 0x6021d0
0 0x7fffdc82d3a0
0 0x7fffdc82d3a0
0 0x6021d0
欢迎任何评论。
操作顺序。两次,你执行 *ox++;
.
这是不评价为(*ox)++
"increment the pointed-to value".
是*(ox++)
"increment the pointer".
why ox is 0?
ox
恰好指向 0
。您已将其递增以指向您不拥有的内存。
您遇到了一些解析问题。让我们逐行看代码:
static int * x = new int(5);
第一次控制流通过这条线时,x
被分配一个指向新分配的 int
的指针,初始化值为 5。接下来每次控制流经过时,该线将被“跳过”。到目前为止没有惊喜。
cout << *x << '\t' << &x << endl;
我怀疑你是想打印值的地址,而不是指针,因此输入了
cout << *x << '\t' << x << endl;
现在变得有趣了。这条线可能并不像你想象的那样。
*x++;
编译器将其解析为 *(x++)
。正在发生的事情是指针 x
被提前并且其先前的值被取消引用并且该结果被丢弃。 (这会在下次进入该函数时调用未定义的行为,因为现在 x
指向分配的内存位置之后的一个。)您可能假设它被解析为 (*x)++
这将增加指向的值-到 x.
同样的模式也适用于您的 main
。
如果我用 GCC 编译你的原始代码并传递 -Wall
标志(这总是一个好主意),它会很好地提示我们正在发生的事情:
main.cpp: In function ‘int* foo()’:
main.cpp:8:7: warning: value computed is not used [-Wunused-value]
*x++;
^
main.cpp: In function ‘int main()’:
main.cpp:16:8: warning: value computed is not used [-Wunused-value]
*ox++;
^
我想在全局范围内访问和修改函数中定义的静态变量,但是输出的第2行和第3行是意外的,为什么ox是0?
#include <iostream>
using namespace std;
int * foo(){
static int *x = new int(5);
cout << *x << '\t' << &x << endl;
*x++;
return x;
}
int main(){
int * ox;
ox = foo();
cout << *ox << '\t' << &ox << endl;
*ox++;
cout << *ox << '\t' << &ox << endl;
int * t= foo();
}
输出是(在我的机器上):
5 0x6021d0
0 0x7fffdc82d3a0
0 0x7fffdc82d3a0
0 0x6021d0
欢迎任何评论。
操作顺序。两次,你执行 *ox++;
.
这是不评价为(*ox)++
"increment the pointed-to value".
是*(ox++)
"increment the pointer".
why ox is 0?
ox
恰好指向 0
。您已将其递增以指向您不拥有的内存。
您遇到了一些解析问题。让我们逐行看代码:
static int * x = new int(5);
第一次控制流通过这条线时,x
被分配一个指向新分配的 int
的指针,初始化值为 5。接下来每次控制流经过时,该线将被“跳过”。到目前为止没有惊喜。
cout << *x << '\t' << &x << endl;
我怀疑你是想打印值的地址,而不是指针,因此输入了
cout << *x << '\t' << x << endl;
现在变得有趣了。这条线可能并不像你想象的那样。
*x++;
编译器将其解析为 *(x++)
。正在发生的事情是指针 x
被提前并且其先前的值被取消引用并且该结果被丢弃。 (这会在下次进入该函数时调用未定义的行为,因为现在 x
指向分配的内存位置之后的一个。)您可能假设它被解析为 (*x)++
这将增加指向的值-到 x.
同样的模式也适用于您的 main
。
如果我用 GCC 编译你的原始代码并传递 -Wall
标志(这总是一个好主意),它会很好地提示我们正在发生的事情:
main.cpp: In function ‘int* foo()’:
main.cpp:8:7: warning: value computed is not used [-Wunused-value]
*x++;
^
main.cpp: In function ‘int main()’:
main.cpp:16:8: warning: value computed is not used [-Wunused-value]
*ox++;
^