堆記憶體或者堆疊儲存器?

2021-09-09 04:19:03 字數 1217 閱讀 9598

《劍指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

...}

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

17 3 22 堆疊記憶體講解

首先在資料結構上要知道堆疊,儘管我們這麼稱呼它,但實際上堆疊是兩種資料結構 堆和棧。堆和棧都是一種資料項按序排列的資料結構。棧就像裝資料的桶或箱子 我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的資料結構,也就是說後存放的先取,先存放的後取。這就如同我們要取出放在箱子裡面底下的東西 放入的...

C 記憶體 堆疊靜態儲存區

學習c 如果不了解記憶體分配是一件非常可悲的事情。而且,可以這樣講,乙個c 程式設計師無法掌握記憶體 無法了解記憶體,是不能夠成為乙個合格的c 程式設計師的。一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存...

堆記憶體 棧記憶體 靜態儲存區

參考部落格 一般說到記憶體,指的是計算機的隨機儲存器ram,程式都是在這裡面執行。1.棧記憶體 棧記憶體由作業系統自動分配和釋放,速度快,使用方便,但程式設計師無法控制。若分配失敗,則提示棧溢位錯誤。注意,const區域性變數也儲存在棧中,向著記憶體位址減小的方向增長。棧記憶體儲存的是程式執行過程中...