Realloc与free一起使用

Realloc与free一起使用,c,dynamic-memory-allocation,realloc,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[

我试图使用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 ;  
}  
有谁能弄明白这一点吗。因为我需要同时使用这两种方法。。
谢谢

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

虽然这也可能不会导致问题,但我还是强烈建议不要使用
realloc
一次增加一个字符的分配。那效率太低了。我将从一个32或64个字符的块开始,并在每次空间用完时将分配增加一些因子(例如,1.5)。通过这种方式,您可以处理不同长度的输入,而无需大量调用realloc

编辑:看看它,真正的问题可能是您在最初调用
realloc
之前没有正确初始化指针。如果您传递的不是空指针,它希望您传递的是从
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 ;  
}  

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

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

虽然这也可能不会导致问题,但我还是强烈建议不要使用
realloc
一次增加一个字符的分配。那效率太低了。我将从一个32或64个字符的块开始,并在每次空间用完时将分配增加一些因子(例如,1.5)。通过这种方式,您可以处理不同长度的输入,而无需大量调用realloc

编辑:看看它,真正的问题可能是您在最初调用
realloc
之前没有正确初始化指针。如果您传递的不是空指针,它希望您传递的是从
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 ;  
}  

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

请发布收到的错误。我收到了此错误***检测到了***./reallocdemo:realloc():无效指针:0x00d5cff4***===========================================/lib/i386 linux gnu/libc.so.6(+0x6b961)[0xc6b961]/lib/i386 linux gnu/libc.so.6(realloc+0x2ad)[0xc7073d]/lib/i386 linux gnu/libc.so.6(realloc+0x2c5)[0xc70755]。/reallocdemo[0x80484b6]/lib/i386 linux gnu/libc.so.6(uu libc_start_main+0xe7)[0xc16e37]。/reallocdemo[0x8048401]消息未初始化。至少你可以在调用realloc之前将其设置为null。哦,太好了!!!消息初始化解决了这个问题。谢谢wildplasser!!!!realloc()调用仍然不能防止意外。它可能会返回NULL,并且会泄漏内存。(不是在普通情况下;但实际上大多数情况下都不是普通的;-)请发布收到的错误。我收到了此错误***检测到***./reallocdemo:realloc():无效指针:0x00d5cff4***==============================/lib/i386 linux gnu/libc.so.6(+0x6b961)[0xc6b961]/lib/i386 linux gnu/libc.so.6(realloc+0x2ad)[0xc7073d]/lib/i386 linux gnu/libc.so.6(realloc+0x2c5)[0xc70755]。/reallocdemo[0x80484b6]/lib/i386 linux gnu/libc.so.6(uu libc_start_main+0xe7)[0xc16e37]。/reallocdemo[0x8048401]消息未初始化。至少你可以在调用realloc之前将其设置为null。哦,太好了!!!消息初始化解决了这个问题。谢谢wildplasser!!!!realloc()调用仍然不能防止意外。它可能会返回NULL,并且会泄漏内存。(不是在琐碎的情况下;但实际上大多数情况都不是琐碎的;-)嗨,杰瑞!!是的,我肯定会用它来分配内存,分配的内存是以前分配的内存的一部分。但在这里,我只是检查一下realloc和free的使用情况,这会导致问题。我认为这是不好的。首先,你给出了一个不属于评论的答案,并且没有关注真正的问题。然后你把这变成一个答案。嗨,杰瑞!!是的,我肯定会用它来分配内存,分配的内存是以前分配的内存的一部分。但在这里,我只是检查一下realloc和free的使用情况,这会导致问题。我认为这是不好的。首先,你给出了一个不属于评论的答案,并且没有关注真正的问题。然后你把它变成一个答案。