簡體   English   中英

內存未重新分配

[英]Memory is not reallocating

我在一個項目的中間,正在嘗試使用malloc()realloc() 我知道當我malloc時,它可以工作,但是當我使用realloc時,它根本不會改變分配的內存量。 我一直都在說,重新分配會重新分配您已經分配的內存。

這是我所擁有的:

這包括:

#include <stdlib.h>

我有一個結構:

struct student {
    int age;
    int numOfClasses;
    int gender; //0 male; 1 female
} student;

當我想使用malloc制作其中7個結構時,我將使用以下代碼行:

student stud* = (structure*) malloc(7*sizeof(student));

這條線有效。 該行代碼占用結構的大小,並乘以7的倍數。簡而言之,這將占用足夠的內存以構成7個結構的數組。

現在,如果我想將其更改為8,則可以這樣做,其中A是先前分配的內存,而B是新分配(或重新分配)的內存:

在此處輸入圖片說明

這是我在代碼中的方法:

stud = (student*)realloc(stud, 8*sizeof(student));

據我所知,realloc在第二個參數中接受變量,並malloc分配該數量的內存。 然后,它獲取指針(或先前分配的指針),並使用給定指針盡可能多地填充剛分配的內存。 當然,第二個參數必須大於先前分配的大小,否則stud最終會丟失一些內存。 現在這是我的問題所在。 當我在上面撥打電話時,它沒有任何改變。 malloc數組的長度仍然為7。我也很確定,我有足夠的內存來重新分配。

我這樣做對嗎? 我的問題在哪里?

您對realloc的行為的理解幾乎是正確的。 沒有返回不同的指針; 可能是因為初始塊之后有足夠的未使用內存,所以堆管理器可以將相同的指針返回給您(但可以調整其內部狀態,以便它知道該塊現在更大了)。

不過,您犯了一個小錯誤。

stud = (student*)realloc(stud, 8*sizeof(student));

在這里,您將stud指針替換為realloc的返回值。 如果由於內存不足而碰巧返回NULL ,則您丟失了原始的stud指針,並且內存泄漏。 您應該改為使用臨時指針。

tmp = realloc(stud, 8*sizeof(student));
if (tmp)
    stud = tmp;

還要注意,您仍然必須在第八個插槽中放置一些東西。 重新分配后,第八個插槽是已分配的有效內存,但包含垃圾,直到您在其中存儲了有意義的內容為止。

盡管我有以下建議,這應該可以工作:

不要轉換malloc的返回值。 它在C語言中沒有用,並且可能隱藏了您忘記包含<stdlib.h>

不要使用ptr = realloc (ptr, ...)因為這會在realloc返回NULL的情況下造成內存泄漏。 相反,使用

if ((new_ptr = realloc (stud, 8 * sizeof (*stud))) != NULL) {
     stud = new_ptr;
} else {
     scream_and_die("out of memory");
}

並使用sizeof (*stud) ,即使用指針而不是要指向類型來引用表達式(與所分配的指針的特定類型無關)。 這樣,當您重命名typedef時,malloc / realloc行無需修改。 換句話說,C中動態內存分配的最佳實踐是

#include <stdlib.h>
sometype *ptr;
...
ptr = malloc (N * sizeof *ptr);

對於N種類型的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM