C語言記憶體重寫和記憶體遺漏是什麼意思?什麼情況下會發生呢

2022-11-13 01:46:49 字數 3978 閱讀 3314

1樓:

沒怎麼聽過這個概念,但是我覺得你說的應該是記憶體溢位和記憶體洩露這兩個問題

記憶體溢位也就是定義的變數長度不足,記憶體不夠儲存資料導致資料超出界限,這通常是由於資料長度判斷不嚴格造成的。好比只定義了一個能裝5個蘋果的盒子卻要裝8個蘋果,剩下的3個只能放到其他蘋果的位置了,其他的蘋果就等於是被「重寫」了

例子,定義了int a[2]變數,再定義int *p = a,當用p[2] = 0寫入資料時,就發生了記憶體溢位。由於c語言只檢查指標是否有效(能讀寫),這就可能導致指標被賦予一個特殊的值,比如指向程式**部分,這時候往指標中寫入的資料就有可能覆蓋原本的命令,而且有可能被程式或者系統執行。還有一種情況就是錯誤的指標可能意外的修改了其他變數的值,這個通常在結構體變數中發生。

一句話就是溢位的記憶體

記憶體洩露就是給指標分配了記憶體卻並未做**,導致系統一直認為你正在使用這塊記憶體,當不再有指標指向這塊記憶體,也就是無法正常手動**時,就造成了記憶體洩露。記憶體洩露會導致系統可用記憶體越來越少,直到再無記憶體可供分配或者程式被終止。由於系統自身**缺陷而存在的記憶體洩露,由於除非關機重啟,系統一直在執行,會導致洩露的記憶體一直得不到**,最終記憶體耗盡系統崩潰宕機

2樓:匿名使用者

指標濫用或者申請的記憶體沒有及時釋放的時候就會發生

c語言中記憶體側漏是什麼意思

3樓:喜相逢

簡單說,就是某些實體記憶體被佔用了,並且不能被釋放掉,這樣這些記憶體就不能用了,好像實體記憶體減少了一樣,這就是記憶體洩露。另外是記憶體洩露,不是記憶體側漏,容易讓人產生誤解!

4樓:珺伴伴

申請了不釋放就是洩漏

如 char* p = (char*) malloc(100);

p用完後沒有 free(p)

5樓:memo_阿勒秋

c語言支援動態記憶體分配,給予程式設計師更加靈活的管理記憶體的許可權。當使用malloc或者new在堆中申請記憶體,而結束時大意的沒有使用free或者delete去釋放申請的記憶體,此時就會造成原來申請的記憶體不可用,從而造成記憶體洩露。

c語言中的記憶體漏洞是什麼意思,請指教!

6樓:匿名使用者

就是記憶體一直被程式佔用沒有釋放,越來越多之後導致程式執行出差,比如malloc函式分配一塊記憶體後沒有用free函式進行釋放

7樓:

記憶體洩露吧,是指分配了記憶體,沒有釋放,造成系統無法收回,就無法再使用。

比如這段:

void func( void )

這樣就造成了1000個位元組的洩露

正確的做法是使用完成後 free掉,

new也是一樣,要delete

c語言:什麼情況下需要釋放記憶體

8樓:匿名使用者

malloc申請記憶體以後,一般需要free

9樓:匿名使用者

申請記憶體後需要釋放,比如malloc,realloc

10樓:育知同創教育

c管理記憶體大致可以理解為兩種,一個是分配在棧上的,另一個是分配在堆上的。

臨時變數,動態變數,分配在棧上,執行完,直接彈出棧,就沒了。

分配在堆上的記憶體,釋放的時候,基本上可以理解為,指標不指這裡了。也就失去了對這塊記憶體的控制。其實所謂的釋放。字面意思容易讓人理解錯。

有些機器有些作業系統,會在釋放的時候清空這段記憶體,但是這種做法效率不高,但是安全,很少有機器這麼做,多數都是所謂釋放,就是不讓控制這塊記憶體了而已。

c語言記憶體釋放問題

11樓:在晴天的雨傘

是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);

12樓:立花裡子來米蘭

看看是不是你別的程式地方錯了,註釋掉看看。有可能是別的地方錯了影響到編譯器的判斷

儘量釋放吧,那個倒是不用,因為靜態變數在棧區。要釋放的主要是動態分配的記憶體,那個會越用越少

13樓:匿名使用者

只有malloc() 、realloc()、 strdup(內部也是用的malloc實現的)這樣的函式以後才需要用free()函式去釋放指標!! 有新分配才需要去釋放。沒有就不應該去釋放,否則會出錯!

順便說一下:

char *p="name"; 這句的意思將指標指向一個常量字串資料所在的首地址,任何常量資料的地址都是由系統分配的,是個靜態的地址,其內容不能修改! 你可以嘗試去改一下,如:*(p+1)='c' ;

14樓:夢的起步

1. 是要手動釋放指標。

2. 報的是前面那一句的錯誤, 不能*p="name";

c語言什麼情況下需要用malloc來申請記憶體,為什麼要申請記憶體?目的是什麼?

c語言問題:在什麼情況下需要我們手動申請記憶體?

15樓:

這個感覺手動申請記憶體的情況主要是在不知道你儲存的資料是什麼一個數量級時使用的。當然你申請一個很大的陣列也可以解決這個問題,不過還浪費大量的記憶體空間。使用動態申請可以比較靈活的使用分配記憶體空間,但是不要忘記釋放。

我個人感覺動態記憶體在實際應用程式中較常見(因為此時記憶體使用可以控制的相對合理),但是在搞演算法時就很少用動態了(比如acm競賽)。

16樓:

在連結串列中 我們需要自己申請記憶體 如malloc函式和calloc都是用來申請記憶體的

17樓:匿名使用者

動態申請的記憶體,在使用結束後必須釋放,否則會造成記憶體洩漏(記憶體越來越少,最後沒記憶體可申請)

18樓:匿名使用者

需要的記憶體較大時,但這個較大也要看程式執行環境

19樓:扎俊

在需要調整資料大小(如陣列長度調整)時

20樓:

手動申請記憶體的情況主要是在不知道你儲存的資料是什麼一個數量級時使用的。

當然你申請一個很大的陣列也可以解決這個問題,不過還浪費大量的記憶體空間。

使用動態申請可以比較靈活的使用分配記憶體空間,但是不要忘記釋放。

而動態記憶體在實際應用程式中較常見(因為此時記憶體使用可以控制的相對合理),但是在搞演算法時就很少用動態了(比如acm競賽)。

c語言無限malloc會丟擲異常嗎?還是會耗盡記憶體?

21樓:風若遠去何人留

不會丟擲異常

malloc 分配記憶體成功 則會返回首地址失敗 返回null

所以 根據返回值就可以判斷是否成功了。

22樓:不說無所謂謂謂

malloc有返回值,申請不到記憶體是返回null

23樓:匿名使用者

應該是會報記憶體不足的錯吧

C語言 動態記憶體分配

p1 int malloc 10 sizeof int 就是生成了一個動態陣列啊 而且c語言裡p x 實際上就等價於 p x 只要p是指標型別的變數,不管它是陣列,還是其他什麼,都不會報錯 malloc函式的實質體現在,它有一個將可用的記憶體塊連線為一個長長的列表的所謂空閒連結串列。呼叫malloc...

C語言分配記憶體後怎麼刪除特定記憶體的數值

三種辦法 1 用一個額外的陣列表示menbers陣列中哪些是有效的,要刪除是隻需將menbers 3 對應的標誌置成不可用即可 2 使用一個變數menberscount來表示有效的company個數,刪除後將後繼的company依次前移一個company空間,前移時可以用memcpy函式。所有前移完...

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

把連結串列建立的函式貼出來。否則難以判斷。還有lnode 和linklist的型別定義貼出來再請求一次,把lnode 和linklist的型別定義貼出來!從 l next 的用法,我推測linklist是一個結構體指標型別,作用是指向連結串列頭。可是你在malloc的時候,用的sizeof link...