如果我们在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++?
我有一个函数:
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!
这可能会引起混乱,因为如果你期望returned
和gotcha
不同,你会大吃一惊。它们都将指向{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];
}
相关文章:
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 返回语句后的代码,没有警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 返回非 void 的函数中没有返回语句警告
- 返回 *这会给出 Weffc++ 警告
- 有没有办法在从临时返回按值string_view时获得编译器警告?
- C++未使用的变量警告,即使我在函数结束时返回它
- libmysql:警告:返回局部变量"行"的地址(C++/C)
- 警告 C6031 返回值在宏扩展中被忽略
- 警告:返回对临时 - 奇怪情况的引用(对 Rvalue 的澄清)
- 是否有将引用返回到临时引用的C++警告?
- 为什么 ++ 运算符触发器返回对局部变量警告的引用
- 警告:函数使用不带尾随返回类型的'auto'类型说明符
- 如何获取有关 Visual Studio 代码分析中未经检查的函数返回值的警告
- "警告:并非所有控制路径都返回值"是什么意思?(C++)
- 获取“将返回值分配给新变量”的警告和输出是内存地址
- 获取控制权到达非无效函数警告的末尾,尽管我在 th 函数中有返回语句
- 三元运算符:编译器不发出局部变量警告的返回引用
- 为什么 C++ 编译器不警告返回对局部变量的引用
- 为什么for_each+lambda触发器-Waggregate返回警告