Realloc免费使用

时间:2012-06-21 23:24:54

标签: c dynamic-memory-allocation realloc

我正在尝试使用realloc函数将输入字符存储在动态数组中。当我使用它时没有调用自由方法在使用后释放内存,一切都很顺利。但是当我使用它与free方法运行时错误来了。这是我的代码段。

int main(){  
char *message ;  
int len = 0 ;
char c ;  
while((c=getchar()) != '\n'){  
    message = realloc(message,(len+1)*sizeof(char)) ;  
    message[len++] = c ;  
}     
message = realloc(message, (len+1)* sizeof(char));  
message[len]='\0' ;  
printf("Message is %s\n",message);  
free(message) ;  
return 0 ;  
}  

任何人都能弄清楚这一点。因为我需要同时使用这两种方法.. 谢谢!!!!

1 个答案:

答案 0 :(得分:1)

虽然它可能不会导致你看到的问题,X = realloc(X, newsize);是一个等待爆炸的定时炸弹。 realloc可以返回空指针,如果无法分配您要求的新块,则保持现有数据不变。当/如果它这样做,这将用NULL覆盖现有指针,泄漏你先前分配的内存(并且没有分配更多)。

虽然它可能也没有引起问题,但我也建议(强烈)反对使用realloc一次增加一个字符的分配。这非常低效。我会从一个32或64个字符的块开始,并在每次空间不足时增加一些因子(比如1.5)。通过这种方式,您可以处理大量不同的输入,而无需大量调用realloc。

编辑:看一下,真正的问题可能是你在初次调用realloc之前没有正确初始化你的指针。如果您传递的不是NULL指针,它会将您传递的内容作为从malloc / calloc或之前调用realloc获得的有效指针。

int main(){  
char *message ;  
int len = 0 ;
char c ;  
while((c=getchar()) != '\n'){  
    message = realloc(message,(len+1)*sizeof(char)) ;  
    message[len++] = c ;  
}     
message = realloc(message, (len+1)* sizeof(char));  
message[len]='\0' ;  
printf("Message is %s\n",message);  
free(message) ;  
return 0 ;  
}  

至少在我看来,这没有任何错误消息。