访问结构中的数组会导致 clang 警告

Accessing an array within a struct causes warnings with 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 不是 return 指向全局数组的指针吗?

或者 get(0) return 是一个临时变量,编译器错误地认为 c_arr 只是它的一个实例,而不是全局变量?

编辑

为什么将此临时变量传递给函数却没有警告?

void call(char* in){}

int main(){
  call(get(0).c_arr);
  return 0;
}

get returns 按值,然后 get(0) 做 return 一个临时的,它在完整表达式后被销毁,剩下的 a 是一个悬挂指针。

请注意,returned 临时 test 是从 array[index] 复制的,包括数组数据成员 c_arra 应该指向临时 test 的数据成员数组 c_arr 的第一个元素,在完整表达式之后(即 char* a = get(0).c_arr; 中的 ; ) 整个临时 test (及其数据成员 c_arr)被销毁,然后 a 变为悬空。

如果get return通过引用就可以了。

test& get(int index){
 return array[index];
}

编辑

您添加的代码没问题。临时对象在完整表达式之后被销毁,即在 call(get(0).c_arr); 中的 ; 之后。传递给 call 的指针在 call.

中仍然有效