2012-10-05 107 views
0

我的功能給予了「晃來晃去參考的警告,即:鏗鏘懸掛參考?

int mode_pos = 0, mode; 
static char *s; 
char buffer[FAT_BUFFER + 1]; 

chan->i_mode = chan->mode; 
buffer[0] = 0; 
s = buffer; 
mode = chan->mode; 

if (!mode) 
     return NULL; 
     ^^^^^^^^^^^^ 

與局部變量「緩衝」相關聯的堆棧存儲器的地址仍然是由被稱爲在返回給調用者的全局變量「S」。這將是一個懸而未決的參考

這是嚴重的,什麼是最好的方法來實際糾正它?

回答

1

是的,這是嚴重的。
它導致未定義的行爲buffer的生存期限制在該功能的範圍內({,}),並且其可能/不可能超出功能體。它可能有時似乎有效,有時可能會失敗。它不能保證工作,你會希望你的程序以定義的方式工作。所以應該避免它。

您需要以這樣的方式定義buffer,以使其壽命增加超出函數體。有兩種方法可以做到這一點:

  1. 您使用malloc()動態內存分配(來電要記得free()它)或
  2. 聲明bufferstatic地方。
+0

我繼續前進,只是使緩衝區靜態:)謝謝! – user1621581

3

你好像有設計問題,在這裏。如果s實際上只用於該功能中,並且單方面設置爲buffer,則完全沒有意義可以使用static。如果是這樣,這個懸而未決的參考也不是非常危險的,但是更好地清理你的代碼以避免意外。