[英]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;
}
正確答案謝謝那些有相同疑問的人可以使用它。
實際上,您重新分配的資源少於重新分配之前的資源。 首先,您為5
( boyut
)整數分配空間,然后僅為兩個整數重新分配空間。 您需要增加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.