【发布时间】:2017-02-10 10:08:18
【问题描述】:
我写了这个函数,它逐个字符地读取字符串并增加分配的大小。 由于某种原因,我在 VS2010 中随机出现错误“_CrtIsValidHeapPointer”,同时读取大约 100+ 个字符的字符串。 我试图调试它,但我真的不知道什么是错的
char *unknown_size_string(){
int i=0, size=10;
char *name=NULL, *alloc_check=NULL, letter;
//allocates initial size of 10 bytes
name=(char *)malloc(sizeof(char)*size);
if(!name){return NULL;}
//reads char by char until newline reached
while((letter=getchar())!='\n'){
*((name)+i++)=letter;
//when the remaining buffer size is 1 byte, allocating another 10 bytes
if((i+1)==size){
alloc_check=name;
realloc(alloc_check,(size+=10)*sizeof(char));
if(!alloc_check){return name;}
name=alloc_check;
}
}
*((name)+i)='\0';
return name;
}
任何帮助将不胜感激。
谢谢
【问题讨论】:
-
最后一个
*((name)+i='\0';可能会导致错误,如果字符串的确切长度为 10 个字符,您将不会重新分配它,然后在第十一个位置添加 '\0' (i = 10).. . 或者我错了 -
我想我在剩下 1 个字节时已经被分配覆盖了,但我想看看它是否改变了什么
-
@MartinVerjans 你是对的。检查应考虑结束空空间。
-
应该没有剩余字节,因为寻址从第 0 个元素开始(当您检查 i+1,i=9 时,您刚刚分配了第 10 个元素)。
-
您可能对
getline感兴趣,它可以做您想做的事情,但可能更有效。请注意,此函数不是基本标准的一部分,而是扩展的一部分。阅读链接的参考页面了解更多详情。