2015-07-12 59 views
0

我想將一堆字符掃描到數組中。我已經使用malloc來設置數組的原始大小,但是如果用戶輸入的字符多於初始大小允許的字符數,我希望使用realloc來增加大小。我不太確定把realloc放在哪裏,或者它應該在條件語句中。使用realloc來增加數組的大小

char *strscan(void) { 
    int size = sizeof(char) * 10; 
    char *a = malloc(size); 

    // Below I try to read character input from the user and store it in the array. 

while (a != EOF) { 

    scanf("%c", a); 
    if (trace) printf("%c", *a); 
    ++a; 
    a = realloc(a, 2 * size); 
} 

    return a; 

} 

截至目前,輸入時仍然會發生堆緩衝區溢出,例如15個字符。

回答

4
++a; 
a = realloc(a, 2 * size); 

這就是問題所在。 realloc的第一個參數必須是由malloc家族函數或空指針返回的指針。 a曾經是一個,但通過++a;,它不再是。

1

您需要兩個指針。一個是緩衝區的位置。另一個是當前角色的位置。當它們之間的差異足夠大時,重新分配緩衝區並重置指針。

2

刪除該++ a。這是這裏的罪魁禍首。

realloc()接受NULL指針或malloc返回的指針。

閱讀手冊頁。

希望你能理解。快樂編碼..

3

我在這裏看到兩個問題。

首先是您增加了a,然後將遞增的值傳遞給realloc。由於傳遞給realloc的指針不是從malloccallocrealloc返回的值,或者爲NULL,因此可能會導致錯誤。

的第二個問題是,你不增加你的內存緩衝區的大小,在第一次調用後realloc,因爲你總是傳遞2 * sizesize永遠不會改變。所以你最終會跑過緩衝區的盡頭。

您需要一個單獨的指針來跟蹤下一個字符應該去的位置,並且您需要跟蹤當前緩衝區有多大,並且只有當您的現有緩衝區滿時,才需要跟蹤該緩衝區的大小和realloc

char *strscan(void) { 
    size_t size = sizeof(char) * 10; 
    char *a = malloc(size); 
    char *current; // The current character 
    ptrdiff_t diff; 

    current = a; 
    do { 
    scanf("%c", current); 
    if (trace) printf("%c", *current); 
    if (current - a >= size - 1) { 
     size *= 2; 
     diff = current - a; 
     a = realloc(a, size); 
     current = a + diff; // Since "a" could change, we need to modify "current" as well 
    } 
    } while (*current++ != '\n'); 
    *current = '\x0'; 

    return a; 
}