繁体   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