[英]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
不返回指向全局數組的指針嗎?
還是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
的第一個元素,在完整表達式之后(即;
in 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.