2017-02-10 95 views
2

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

上一个'*((name)+ i ='\ 0';'如果字符串的精确长度为10个字符,则会导致错误,您不会重新分配它,然后在第11个位置(i = 10)添加'\ 0'...或者我错了 –

+0

I想想我有剩余1字节的分配情况,但生病尝试看看它是否改变了一些事情 –

+0

@MartinVerjans你说得对。检查应该完成占最后零空间。 –

回答

3

除了有关考虑空终止字节的意见,主要的问题在这里:

realloc返回新分配的区域(可能是相同的,也可以不是)。

因此,您必须在realloc(alloc_check,(size+=10)*sizeof(char));中指定返回alloc_check或者您只是创建内存泄漏并继续在旧位置写入。

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.

+0

你说得对+1。但不适用于'sizeof(char)',它可以是!= 1(即在EBCD系统上);)。 C标准没有指定它。 –

+1

@Frankie_C谢谢你的UV。我在这里多次阅读'sizeof(char)== 1',将会检查:发现它:http://stackoverflow.com/questions/40679801/difference-between-sizeofchar-and-sizeofchar –

+1

@Frankie_C:'sizeof (char)'被C标准保证为'1'。不能保证'1'对应于一个8位字节(参见['CHAR_BIT'](http://en.cppreference.com/w/c/types/limits))。 –

相关问题