访问结构中的数组会导致 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_arr
。 a
应该指向临时 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
.
中仍然有效
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_arr
。 a
应该指向临时 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
.