首页 > 解决方案 > 访问结构中的数组会导致警告与 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;
}

标签: c++temporary-objects

解决方案


get按值返回,然后get(0)返回一个在完整表达式后被销毁的临时对象,留下a一个悬空指针。

请注意,返回的临时test值是从中复制而来的array[index],包括数组数据成员c_arra应该指向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


推荐阅读