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
内保持有效。