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

时间:2012-12-16 13:03:29

标签: c++

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

3 个答案:

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

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