1樓:甕瑗
把連結串列建立的函式貼出來。否則難以判斷。
還有lnode 和linklist的型別定義貼出來再請求一次,把lnode 和linklist的型別定義貼出來!
從 l->next;的用法,我推測linklist是一個結構體指標型別,,作用是指向連結串列頭。可是你在malloc的時候,用的sizeof(linklist)),也就是對指標型別取size,通常固定是4,也就是說的你原意是要申請一個結構體大小的buff,結果是申請到一個指標大小的buf
如果linklist是一個結構體型別,而不是指標型別,那麼s=l 這樣的語句就是徹底錯誤的,要知道void listfree(linklist l),這裡的l是區域性變數,進入函式時從堆疊中得到的,而不是你malloc出來的。所以你的free一定是失敗的。
2樓:匿名使用者
1、如果是小程式,就算不釋放一般沒什麼大後果,因為開記憶體比較小。因為這裡的空間就是記憶體空間,如果不斷申請的話,會佔用大部分記憶體。如果不釋放的話,就一直佔用記憶體,使記憶體減小。
直到關閉程式,記憶體才會釋放。可以free函式釋放記憶體。
2、free函式:
原型:void free(void *ptr);
功能:釋放malloc(或calloc、realloc)函式給指標變數分配的動態記憶體;
標頭檔案:malloc.h或stdlib.h;
3、為了避免釋放已經釋放了記憶體的指標記憶體,或沒有釋放記憶體,在c語言中最好是在定義指標時賦初值null,釋放後立即賦null,釋放時檢查指標值再決定釋放就避免釋放錯誤了,例如:
int *a = null
int *b = (int*) malloc(sizeof(int) * 10);
a= b;
/* 執行大量操作後 */
if(a != null)
if(b != null)
3樓:匿名使用者
linklist 和 lnode* 是同一種型別嗎,如果不是就會re,如果是也建議使用相同識別符號
c語言關於棧的記憶體釋放問題
4樓:在晴天的雨傘
是initstack(s)吧?程式裡就沒有initsqlist()。
因為棧內容沒有初始化,所以訪問那個s->top時就出錯了,並不是分配記憶體的malloc的問題。
把主函式裡這兩行改一下:
stack *s; /* 這裡沒有給s分配記憶體,這只是一個stack的指標*/
initstack(s);
改為:stack s; /* 這樣就給s分配空間了, s.top現在就可以用了*/
initstack(&s);
這個問題就好了。
相應地,以後使用棧時注意使用指標就好:
showstack(s);
改為showstack(&s);
還有一種做法,就是在:
stack *s;
initstack(s);
中間給指標s分配記憶體,讓指標s指向正確的結構:
stack *s;
s = (stack*)malloc(sizeof(stack));
initstack(s);
C語言輸出問題,C語言 建立連結串列與輸出連結串列的問題
我在你 的基礎上,稍微改了點,你看下,是否就是輸出你想要的 include main 程式中少了幾個變數的宣告。輸出的不是從0到1000,這是因為你把step的值定為了50的緣故啊。下面是把step改為了10的執行結果 include main 標準c語言庫函式fprintf printf格式字串的...
c語言的連結串列的儲存與讀取,關於C語言中,連結串列資料的檔案儲存和提取。
你的檔案時以二進位制開啟的,用文字編輯器看亂碼是正常的。但是程式裡有幾個問題 1.typedef struct book typedef是多餘的 if fp null 開啟檔案出錯後,沒有退出函式,真的出現開啟檔案出錯,程式就有問題了。3.for p head pnext p p p pnext 一...
c語言問題,C語言問題
struct student拼寫成struct studnt了。拼寫錯誤 struct studnt沒有定義,所以無法執行sizeof。include typedef struct student int main c語言問題?嗯你的理解是對的,break就是用來跳出的switch,如果沒有brea...