c++ - 访问结构中的数组会导致警告与 clang
问题描述
struct test{
char c_arr[1];
};
test array[1] = {{1}};
test get(int index){
return array[index];
}
int main(){
char* a = get(0).c_arr;
return 0;
}
编译它g++
没有警告但clang++
打印以下内容:
warning: temporary whose address is used as value of local variable 'a' will be destroyed at the end of the full-expression
这是不正确的吗?不get(0).c_arr
返回指向全局数组的指针?
还是get(0)
返回一个临时变量并且编译器c_arr
错误地认为它只是它的一个实例,而不是全局变量?
编辑
为什么将此临时变量传递给函数可以在没有警告的情况下工作?
void call(char* in){}
int main(){
call(get(0).c_arr);
return 0;
}
解决方案
get
按值返回,然后get(0)
返回一个在完整表达式后被销毁的临时对象,留下a
一个悬空指针。
请注意,返回的临时test
值是从中复制而来的array[index]
,包括数组数据成员c_arr
。a
应该指向c_arr
临时数据成员数组的第一个元素test
,在完整表达式(即;
in char* a = get(0).c_arr;
)之后,整个临时test
(及其数据成员c_arr
)被破坏,然后a
变成悬空。
如果get
按引用返回,那就没问题了。
test& get(int index){
return array[index];
}
编辑
您添加的代码很好。临时在完整表达式之后被销毁,即在;
in之后call(get(0).c_arr);
。传递给的指针call
在内部保持有效call
。
推荐阅读
- javascript - Mocha:错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保调用了“done()”;如果返回一个 Promise,确保它解决
- javascript - 使用请求 API 数据的函数时出错
- php - 在 laravel 的数据表中显示数据
- sql - 函数计数的 SQL 子查询
- xcode - 如何将框架依赖项添加到测试目标?
- html - HTML 和 CSS:它们是否共享相同的 W3C 技术报告开发流程?
- ckeditor - CKEditor 文本值在 BLAZOR 中的帖子中丢失
- c++ - 通过用任何其他字符替换字符使 2 个字符串相等
- php - 无法使用 wp 函数更新 user_meta 数据
- javascript - HTML表格:从一列(每一行)和第二列添加值并将其显示在第三列