访问结构中的数组会导致带有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指向临时test的数据成员数组c_arr的第一个元素,在完整表达式(即char* a = get(0).c_arr;中的;(之后,整个临时test(及其数据成员c_arr(被破坏,则a变为悬空。

如果get通过引用返回,那么就可以了。

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

编辑

你添加的代码很好。临时性在完全表达之后,即在call(get(0).c_arr);中的;之后被破坏。传递给call的指针在call内保持有效。

最新更新