[英]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.