通过指针修改子函数中函数的局部变量的内容



我有以下示例代码。只是想知道在全局指针中获取局部变量的地址,然后在子函数中修改其内容是否有效。以下程序正确修改变量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;
}

只要在a超出范围后不尝试取消引用va[0],这是可以的。你没有,所以从技术上讲,这个代码很好。

也就是说,整个方法可能不是一个好主意,因为它使代码很难维护。

我想说,如果你的程序增长了,你可能会忘记你在某些函数中所做的更改,并得到一些你意想不到的奇怪错误。

只要您在a的范围内调用func(),您的代码就完全有效然而,这被认为不是一个好的做法。考虑

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个问题。

  1. 除非绝对必要,否则不要使用全局变量。全局变量违反封装,可能导致变量名称重叠。在大多数情况下,在需要时将它们传递给函数要容易得多
  2. 这段代码中的指针向量看起来很糟糕。正如您所看到的,我忘记了指针在离开循环时就变为无效,而print_va只是打印出垃圾。简单的解决方案可以是将对象存储在向量中,而不是指针中。但是,如果我不想一次又一次地复制HugeStruct对象,该怎么办?这可能需要相当长的时间。(假设我们有一个百万整数的向量,而不是一个int。)解决方案之一是动态分配HugeStruct,并使用智能指针的向量:std::vector<std::shared_ptr<HugeStruct>>。这样,您就不必为内存管理和范围而烦恼。一旦没有人提及这些物品,它们就会被销毁

最新更新