簡體   English   中英

使用realloc擴展使用malloc占用的內存空間?

[英]Using realloc to extend memory space taken with malloc?

作為學校組織,我需要使用malloc創建內存塊,當內存塊已滿時應該使用realloc擴展自身。這將在無窮循環中繼續。我我在做什么錯?

#include "stdio.h"
#include "stdlib.h"
int main()
{
  int boyut=5;
  int* dizi;
  dizi=(int *)malloc((boyut*sizeof(int)));
  int b=0;
while(b<1)  
    {   
if(*dizi<boyut){                
 scanf("%d",dizi);
dizi++;                
 }
else if(boyut=*dizi)         
 {
    printf("boyut yetersiz");
    dizi = (int*) realloc (dizi,2*sizeof(int));
    boyut=*dizi*2;                  
 }  
}
  return 0;
}

根據答案進行編輯,將malloc區域擴展* 2。

int main()
{
  int boyut=2;
  int* dizi;
  int* dizi1;
  int n;
  dizi=(int *)malloc((boyut*sizeof(int)));
  int b=0;
  int i;
while(b<1)  
    { 

if(i<boyut){           

  for(i=0;i<boyut;i++){ 
    printf("\nDeğer Girin:");
 scanf("%d",dizi);
 }
 }
else if(boyut=i)         
 {

    boyut=boyut*2; 
    printf("\nBoyut yetersiz yeni boyutu %d yapıyoruz",boyut);
    dizi1 = (int*) realloc (dizi,boyut*sizeof(int));
    dizi=dizi1;


 }

}
  return 0;
}

正確答案謝謝那些有相同疑問的人可以使用它。

實際上,您重新分配的資源少於重新分配之前的資源。 首先,您為5boyut )整數分配空間,然后僅為兩個整數重新分配空間。 您需要增加boyut並以此作為乘數進行重新分配。

您還需要記住, realloc可能會失敗,並且在這種情況下,會將dizi設置為NULL ,從而使您既取消引用了NULL指針又失去了原始指針,從而無法釋放它。

另外, 請勿malloc的結果(或為此重新realloc


正如BLUEPIXY所指出的, 真正的問題是由於不確定的行為 對於realloc工作,它需要傳遞的原始指針。 執行dizi++之后,您將不再擁有它。

同樣,在分配內存時,內容未初始化 ,這意味着它將包含看似隨機的數據。 因此,在初始化該數據之前執行*dizi也會導致未定義的行為。 您可能要改用例如calloc

realloc的第二個參數是請求分配的總大小,而不是它應該增長的數量。 您應該跟蹤分配的大小:

size_t size = some_size;
void *ptr = malloc(some_size);
// check for errors

while (some_condition) {
    size += some_increment;
    void *newptr = realloc(size);
    // check for errors
    ptr = newptr;
}

暫無
暫無

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

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