記乙個全域性變數 冒充 區域性變數引起的bug

2022-03-06 08:04:44 字數 803 閱讀 8492

看**相當簡單直觀,覺得怎麼都不會出錯,可執行結果明明就是錯了 - 對著vim摸著腦袋就是想不出**有問題,可去掉新加的**,就又可以了。

沒辦法,只好祭出殺手鐗:一行一行注釋掉來觀察。。。

反映問題的**段相當簡單:

if condition then

local v =create_object(mpr)

if condition2 then v.r = "

fixedr

"end

return

v.mp .. v.r

end

被影響的是和v同類的一些object,可是這個**裡怎麼看都沒問題,v是被我改了,可那是local的啊,管我怎麼改對全域性都不會有影響。

當注釋掉這一行試了一下發現可以之後,帶著不可思議的心情,檢查起來,然後去看create_object()這個函式:

object_cache ={}

function

create_object(mpr)

if object_cache[mpr] then

return

object_cache[mpr]

endlocal obj =split(mpr)

object_cache[mpr] =obj

return

objend

原來我改的東西,不是local的,而是全域性的,放在一張全域性表的cache。。。

這裡為了提高效率,把處理過的東西cache起來了,create_object只要是相同的輸入,返回的都是同乙個object。。。

全域性變數 靜態全域性變數 靜態區域性變數 區域性變數

全域性和靜態變數都在堆裡。這句話應該錯了,應該是放在常量資料段 全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用...

全域性變數 靜態全域性變數 靜態區域性變數 區域性變數

全域性和靜態變數都在堆裡。全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用在定義它的那個檔案裡,卻不能用在程式中...

全域性變數 靜態全域性變數區域性變數 靜態區域性變數

對於乙個完整的程式,在記憶體中的分布情況如下圖 區 low address 全域性資料區 堆區 棧區 high address 一般程式把新產生的動態資料存放在堆區,函式內部的自動變數存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料 即使是函式內部的靜態區域性變數 也存放在全域性資料區。...