我编写了这个函数,它通过char读取字符串char并增加分配的大小。 由于某种原因,我在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;
}
任何帮助将不胜感激。
感谢
答案 0 :(得分:3)
除了考虑空终止字节的评论之外,这里的主要问题是:
realloc
返回新分配的区域(可能相同,可能不是)。
因此,您必须在alloc_check
中分配回realloc(alloc_check,(size+=10)*sizeof(char));
,否则您只会创建内存泄漏并继续在旧位置书写。
alloc_check = realloc(alloc_check,(size+=10));
(好吧,当尺寸更大时,不保证每次都会改变位置,但有时候在没有足够的连续空间时也是如此)
除此之外:name=(char *)malloc(sizeof(char)*size);
=> name=malloc(size);
(char
的大小始终为1,无需投射malloc
指针)
摘自N5170:
当sizeof应用于具有char,unsigned char或signed char(或其合格版本)类型的操作数时,结果为1.