1. 程式人生 > >關於free()棧的記憶體的時,無法繼續執行問題(求助)

關於free()棧的記憶體的時,無法繼續執行問題(求助)

最近學習資料結構,用C語言寫了棧的基本操作,卻發現在銷燬棧時,初始尺寸STACK_INIT_SIZE改成10,1000可以順利執行,改成100無法執行(編譯都沒問題),這讓我無法理解。下面是程式碼和執行的結果,希望有懂得朋友能幫助解釋下,是程式碼問題還是其他問題。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

//STACK_INIT_SIZE改成10,1000可以順利執行,改成100無法執行!
#define STACK_INIT_SIZE 10 
#define STACK_INCREMENT 10
typedef int ElemType; typedef int Status; typedef struct{ ElemType *base; ElemType *top; //棧頂指向準備存放的位置 int stackSize; //當前可以使用的最大容量 }SqStack; Status initStack(SqStack *s){ s->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType)); sizeof(SElemType) if(!(s->base)){ return
false; } s->top = s->base; s->stackSize = STACK_INIT_SIZE; return true; } Status push(SqStack *s,ElemType e){ //如果棧滿(s->top - s->base = s->stackSize),追加空間 if(s->top - s->base >= s->stackSize){ s->base = (ElemType*)realloc(s->base , (s->stackSize + STACK_INCREMENT) * sizeof
(ElemType)); if(!(s->base)){ return false; } s->top = s->base + s->stackSize ; //設定棧頂 s->stackSize = s->stackSize + STACK_INCREMENT; //設定棧的最大容量 } //進棧時先存入資料於棧頂,棧頂指標再往後移 *(s->top) = e; s->top ++; return true; } Status pop(SqStack *s , ElemType *e){ //棧為空 if(s->top == s->base){ return false; } //出棧時棧頂指標先往前移,再取出棧頂資料 (s->top)--; *e = *(s->top); return true; } int getCapacity(SqStack *s){ return s->top - s->base; } Status clearStack(SqStack *s){ s->top = s->base ; return true; } Status destroyStack(SqStack *s){ s->top = s->base + s->stackSize; while(s->top != s->base){ free(--s->top); //執行到這程式停止! cout<<*(s->top)<<" "; } s->top = s->base = NULL; s->stackSize = 0; cout<<"\n"; return true; } int main(int argc, char *argv[]) { SqStack s; initStack(&s); ElemType e = 1; ElemType elm; push(&s,e); e = 2; push(&s,e); e = 3; push(&s,e); e = 4; push(&s,e); e = 5; push(&s,e); e = 6; push(&s,e); pop(&s,&elm); cout<<elm<<" "; pop(&s,&elm); cout<<elm<<" "; pop(&s,&elm); cout<<elm<<" "; pop(&s,&elm); cout<<elm<<" "; pop(&s,&elm); cout<<elm<<"\n"; cout<<"Capacity:"<<getCapacity(&s)<<"\n"; clearStack(&s); cout<<"Capacity after clear the stack:"<<getCapacity(&s)<<"\n"; destroyStack(&s); //cout<<getCapacity(&s)<<"\n"; //cout<<clearStack(&s)<<"\n"; return 0; }

STACK_INIT_SIZE為10的執行結果,程式正常結束。

STACK_INIT_SIZE為100的執行結果,程式終止。

STACK_INIT_SIZE為1000的執行結果,程式正常結束。

相關推薦

關於free()記憶體無法繼續執行問題求助

最近學習資料結構,用C語言寫了棧的基本操作,卻發現在銷燬棧時,初始尺寸STACK_INIT_SIZE改成10,1000可以順利執行,改成100無法執行(編譯都沒問題),這讓我無法理解。下面是程式碼和執行的結果,希望有懂得朋友能幫助解釋下,是程式碼問題還是其他問題

由於找不到 MSVCR100.dll無法繼續執行代碼

log clas 安裝程序 安裝 .dll 管家 可能 解決 ges 由於找不到 MSVCR100.dll,無法繼續執行代碼。重新安裝程序可能會解決此問題 360軟件管家中找到 進行安裝即可由於找不到 MSVCR100.dll,無法繼續執行代碼

由於找不到 opencv_world320.dll無法繼續執行程式碼

  首先找到自己軟體安裝(解壓)的路徑openCV (安裝(解壓)目錄\opencv\build\x64\vc14\bin)    我的安裝(解壓)目錄是:F:\OpenCV\Three320\opencv\build\x64\vc14\bin

關於小米6 執行安裝提示安裝失敗BAIDU_LOCATION_SERVICE

定位SDKv3.1版本之後,以下許可權已不需要,請取消宣告,否則將由於Android 5.0多帳戶系統加強許可權管理而導致應用安裝失敗。 <uses-permission android:nam

mysql安裝問題記錄MSVCR120.dll檔案丟失無法正常啟動0xc000007b初始化失敗

並先執行第一個檔案安裝.NET 2.0、.NET 3.5等 然後安裝第二個檔案進行安裝 最後初始化失敗 原因:my.ini檔案格式是utf-8  解決辦法,my.ini檔案儲存為ANSI格式檔案 

JS拼接function傳遞IDUUID引數值不準確問題

問題描述:此處我們傳遞的引數ID是Oracle資料裡面資料的ID,我使用的是MybatisPlus中的IdWorker.getId()這樣的 需要傳遞資料ID,類似於:870191925104693248,859678698633596928這樣的資料 是通過拼接傳遞的

IE9的console不兼容問題 在控制臺打開代碼中要顯示的結果數據到了conso這裏無法繼續執行

() 代碼 發現 習慣 csdn out 停止 size rom 轉自 http://blog.csdn.net/ywl570717586/article/details/53084655 今天發現並不是所有瀏覽器都像Google chrome一樣,可以正常使用cons

伺服器無法繼續執行該事務此會話中的活動事務已由另外一個會話提交或終止。

//執行事務處理 public void DoTran() {  //建立連線並開啟  SqlConnection myConn=GetConn();  myConn.Open();  SqlCommand myComm=new SqlCo

laravel框架學習win下php artisan tinker 測試資料無法執行報錯的解決方法

問題描述: 複製該路徑,在資源管理器的位址列中開啟,會看到 如下: Temp 往往是系統或者其他軟體生成的快取檔案或目錄 需要返回到上一級目錄Temp中,全選資料夾,刪除,提示不允許刪除的話,

Discuz出現對不起您安裝的不是正版應用安裝程式無法繼續執行解決方法

Discuz安裝非應用中心的部分模版外掛會提示“對不起,您安裝的不是正版應用,安裝程式無法繼續執行”,如下圖所示: 這是應用中心的一個版權保護措施,由開發者選擇是否開啟。解決方法如下: 1、用記事本打:/source/ function/ 目錄下的function_clo

C 語言執行free()釋放記憶體 報錯

今天遇到了一個問題。先用malloc()分配一定大小的記憶體,然後在主函式最後要對這些記憶體進行釋放。呼叫free函式,執行報錯。單步除錯 執行free()後的報錯如圖 1所示。 最終發現我是這樣做的:例如 分配10個元素記憶體,我對這10個元素進行了賦值,最後是呼叫了fr

導入swaggerDemo無法識別工程的解決辦法

ger log 工程 無法 nbsp img logs wid 技術 1、在已建立的Java工程中,拷貝至demo中 2、打開.project修改工程名為demo的名字即可。 導入swaggerDemo時,無法識別工程的解決辦法

【Python】程序在運行失敗一聲不吭繼續運行pass

pass語句 found col con top path count nts 一聲 在前面程序出現異常時,我們都會給一個提示,告訴用戶,程序為什麽會異常,但是現在我們想在程序出現異常時,不做處理,讓程序默默的往下執行,不要做聲。 那麽我們就引入了pass語句 def co

【BIEE】05_啟動BIEE無法啟動BI_SERVER

ini ora biee style server clas gin 無法啟動 onf 本地修改資料庫後,重新啟動BIEE,結果報錯: 點擊【查看日誌信息】後 從這裏是沒看出是什麽問題造成的,那麽我們就要去查詢啟動日誌了 問題解決 找到日誌路徑:D:\obiee\in

html 表單提交無法獲取到disabled屬性的input值

有效 AS 單元 java check bsp ado 控件 下拉框 input的字段當為disabled是,無法獲取值,無法改變值,所以在表單提交時,獲取不到值。可以用randomly解決這個問題。 <input name="country" id="countr

解決dva dispatch yield生成器函數中異常中斷無法繼續調用的問題

fine defined login 決定 log 返回 spa def clas 在生成器函數中,哪怕是一點報錯。都會導致程序無法再次執行。這是yield的特性導致的。最簡單的解決方案,就是將所有報錯回避,並且做好交互。 1、將所有可能異常的地方判斷好,不讓代碼繼續執

Jquery等待ajax執行完畢繼續執行斷點調試正常運行異常

.ajax cti cati 時間 utf 一個 ajax 發現 not 以前寫過一個程序,發現用斷點調試的時候,一步步的運行,程序是可以的,但是去了斷點程序就出現了問題。 $(document).ready(function(){ var arra=new A

gdb watch 除錯無法watch

伺服器實際執行時, 某個物件的某個變數不知道啥時候被改掉了。   用valgrind查了 ,沒有記憶體越界,  那就是邏輯上有問題。  這種情況 gdb 的 watch功能就非常好用。  它能檢測記憶體中的值被改了,就會自動斷點。

Jquery等待ajax執行完畢繼續執行斷點除錯正常執行異常

以前寫過一個程式,發現用斷點除錯的時候,一步步的執行,程式是可以的,但是去了斷點程式就出現了問題。  $(document).ready(function(){      var arra=new Array();   &n

maven打包後flash檔案變大無法正常執行

最近一個老專案重構,前臺使用了swfupload來實現多檔案上傳,這是一個用flash實現的外掛。 開發階段,打包測試時均無問題。測試階段,在伺服器部署後,該外掛就莫名失效了。 經過排查最終確認是maven打測試包時,加上了資源過濾導致swfupload.swf檔案變大。