堆記憶體還是棧記憶體?

2021-06-26 07:14:58 字數 1201 閱讀 6216

《劍指offer》裡面有一道題目,「把一字元陣列中的空格用字串「%20」代替「,看了書上的思路,然後我寫出來的程式當輸入的空格太多時,會出現錯誤「memory clobbered before allocated block」。其原因是沒搞清楚棧記憶體,堆記憶體的分配和區別。錯誤**如下:

#include #include #include void replacespace(char string);

int main()

void replacespace(char string)

finallen = originlen + spacenum * 2;

string = realloc(string,finallen); //realloc函式 在堆記憶體區分配記憶體

originindex = originlen;

finalindex = finallen;

while(originindex >= 0)

else

--finalindex;

--originindex;}}

程式的第9行定義並初始化了乙個字元陣列string,它的記憶體分配由系統自動在完成,且是在棧上分配的。

當我在replacespace函式中要把string中的空格替換成「%20」的時,需要給它擴充套件記憶體,這時我想到了realloc函式。但不幸的是,realloc函式操作的是堆記憶體,而string的記憶體是在棧上分配的,所以realloc函式在堆上根本就找不到string所占用記憶體對應的位址,更別說給它擴充套件記憶體空間了。所以這個函式返回乙個空值,這也就是報錯的原因。

解決方法:

1. 一開始就給string字元陣列給足空間,不在replacespace函式中重新擴充套件。

char string[100] = "this is a test!";
2. 使用malloc函式給string分配空間。

int main()

void replacespace(char string)

else

...}

盜一段**,(這段**對於堆和棧的區別說的很清楚啊):

堆記憶體 棧記憶體

從堆和棧的功能和作用來通俗的比較,堆主要用來存放物件的,棧主要是用來執行程式的.而這種不同又主要是由於堆和棧的特點決定的 在程式設計中,例如c c 中,所有的方法呼叫都是通過棧來進行的,所有的區域性變數,形式引數都是從棧中分配記憶體空間的。實際上也不是什麼分配,只是從棧頂向上用就行,就好像工廠中的傳...

堆記憶體和棧記憶體

堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不...

術語 堆 記憶體 ,棧 記憶體

堆表示程式可用的記憶體區,也叫動態記憶體區。堆記憶體的分配與釋放次序是隨機的,這就是說,如果你按次序分配三塊記憶體,那麼到時並不按分配時的次序釋放記憶體。堆管理器會負責所有操作,你只需簡單地使用getmem 函式請求新記憶體或呼叫constructor 建立物件,delphi 會返回乙個新的記憶體塊...