簡體   English   中英

訪問結構中的數組會導致發出叮當聲警告

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM