如果我们在c++中使用static关键字删除[-Wreturn local-addr](警告:返回本地变量的地址),可以

Is it ok if we remove [-Wreturn-local-addr] (warning: address of local variable returned) by using static keyword in c++?

本文关键字:返回 警告 变量 可以 地址 local-addr c++ 我们 static -Wreturn 删除      更新时间:2023-10-16

我有一个函数:

int* sumCalc(int *p1, int *p2, int n1, int n2)
{
    int sum[100] = {0};// = new int[n1+n2];
    for(int i = 0; i < n1+n2; ++i)
    {
        sum[i] = p1[i] + p2[i];
    }
    return sum;
}

我从main()调用这个函数,方法是:

int *sum = sumCalc(p1, p2, n1, n2);

所以我要得到警告。

为了消除警告,我将int数组sum[100]更改为静态,然后返回sum。

int* sumCalc(int *p1, int *p2, int n1, int n2)
{
    static int sum[100] = {0};// = new int[n1+n2];
    for(int i = 0; i < n1+n2; ++i)
    {
        sum[i] = p1[i] + p2[i];
    }
    return sum;
}

那么,使局部变量为静态是一种好的做法吗?

如果我从堆中获取数组sum[100]的内存,那么我也认为这个错误不会存在。但您能告诉我们如何在这里使用new运算符并将数组的所有元素初始化为零吗?

问题在于,在第一个版本中,变量是从堆栈中分配的,而不是从堆中分配的。这意味着当函数返回时,sum变量消失,得到的是一个不指向任何地方的随机剩余地址。

是的,将变量声明为static会使警告消失,但这是一种糟糕的做法。这告诉编译器的是,无论函数被调用多少次,sum变量只有一个副本。这意味着,如果再次调用该函数,数组将具有相同的内容。

int array1[3] = {1, 2, 3};
int array2[3] = {2, 3, 4};
int array3[2] = {5, 6};
int array4[2] = {7, 8};
int* returned = sumCalc(array1, array2, 3, 3); 
int* gotcha = sumCalc(array3, array4, 2, 2); //Now returned is the same array as gotcha!

这可能会引起混乱,因为如果你期望returnedgotcha不同,你会大吃一惊。它们都将指向{12, 14}

要进行堆外分配,必须使用new运算符。在这个问题中,您可以找到许多初始化数组的方法。

编辑:p.S.-不要忘记delete,即在程序结束时分配给new的指针。

在块作用域中使用关键字static会使

  • CCD_ 12的行为类似于函数变量
  • 它将在函数的不同调用之间共享
  • 以上内容可能不可取

是一个变通办法

  • 在main中定义int sum[100] = {0};
  • 通过将sumCalc签名修改为类似的内容来传递指向相同内容的指针

    void sumCalc(int (*ptr)[100),int *p1, int *p2, int n1, int n2)
    // Note the return type is void
    

并称之为

sumCalc(&sum,p1, p2, n1, n2);

和里面的循环将是:

for(int i = 0; i < n1+n2; ++i)
{
    (*ptr)[i] = p1[i] + p2[i]; 
}