我有以下示例代码。只是想知道在全局指针中获取局部变量的地址是否有效,然后在子函数中修改它的内容。以下程序正确修改变量 a 的值。这种做法会导致任何问题吗?
#include <iostream>
#include <vector>
using namespace std;
vector<int*> va;
void func()
{
int b ;
b = 10;
int * c = va[0];
cout << "VALUE OF C=" << *c << endl;
*c = 20;
cout << "VALUE OF C=" << *c << endl;
}
int main()
{
int a;
a = 1;
va.push_back(&a);
func();
cout << "VALUE IS= " << a << endl;
return 0;
}
答案 0 :(得分:2)
这是可以的,只要在va[0]
超出范围后您不尝试取消引用a
。你没有,所以从技术上来说这个代码很好。
也就是说,这整个方法可能不是一个好主意,因为它使代码很难维护。
答案 1 :(得分:0)
我会说,如果你的程序增长,你可能会忘记你在一些函数中做出的改变,并得到一些你没想到的奇怪错误。
答案 2 :(得分:0)
只要您在func()
范围内致电a
,您的代码就完全有效。 然而,这不被认为是一种好习惯。考虑
struct HugeStruct {
int a;
};
std::vector<HugeStruct*> va;
void print_va()
{
for (size_t i = 0; i < va.size(); i++)
std::cout<<va[i].a<<' ';
std::cout<<std:endl;
}
int main()
{
for (int i = 0; i < 4; i++) {
HugeStruct hs = {i};
va.push_back(&hs);
}
print_va(); // oups ...
}
上面的代码中有2个问题。
print_va
只打印出垃圾。简单的解决方案可能是将对象存储在向量而不是指针中。但是,如果我不想一次又一次地复制HugeStruct
个对象呢?这可能需要很长时间。 (假设我们有一个百万整数的向量而不是一个int
。)其中一个解决方案是动态分配HugeStruct
并使用智能指针向量:std::vector<std::shared_ptr<HugeStruct>>
。这样您就不必担心内存管理和范围。一旦没人会引用它们,对象就会被销毁。