c語言釋放連結串列記憶體的問題,C語言釋放連結串列記憶體的問題

2022-02-15 08:53:59 字數 1599 閱讀 9938

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...