读取未知大小的字符串

时间:2017-02-10 10:08:19

标签: c string

我编写了这个函数,它通过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;
}

任何帮助将不胜感激。

感谢

1 个答案:

答案 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.