1

我正在尝试使用 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 ;  
}  

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

4

1 回答 1

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 ;  
}  

至少对我来说,它运行时没有任何错误消息。

于 2012-06-21T23:32:11.077 回答