堆疊的記憶體分配

2021-08-25 14:04:24 字數 650 閱讀 1179

#記憶體分配

##遇到的問題

最近工作中遇到乙個bug,log顯示剛開始從buf中讀取的內容是正確的,但是將不同的指標指向buf中不同的起始位址,然後經過一些操作後,重新讀取這些指標指向的內容,發現內容不正確了。

void cheange(char *name, char *type)

; char tmp_sep = " ";

int i=0, match_flag=0;

for(i=1; i加上log發現在進入sprintf函式之前指標tmp_value指向的內容是正確的,但是經過sprintf後,我們發現有時tmp_value指標指向的內容被修改了。

最先讀取的config_name是儲存在buf中的,但是buf是個for迴圈內的區域性變數,在for迴圈內,指標tmp_name,tmp_value和tmp_typ分別指向了buf中不同的記憶體位址。但是當for迴圈結束後,系統將自動釋放buf所占用的記憶體,但是此時真真tmp_value依然指向原來的記憶體位址。當進入sprintf函式式,系統需要為陣列res_value在棧段分配新的記憶體,此時就有可能將指標tmp_value指向的記憶體重新分配給res_value,那最res_value的操作,就會影響到tmp_value所指向的內容。

我們把陣列buf的第一和初始化放在for迴圈的外面,就沒有再出現這個問題。

程式記憶體分配 堆疊

程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回...

C 堆疊以及記憶體分配

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類...

預備知識 程式的記憶體分配(堆疊)

以下為網上得到的記憶體分配的堆疊理論原文出處找不到了 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式...