2017-02-10 138 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))。 –

相關問題