2016-04-30 57 views
0
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]){ 

    char buffer[103]; 
    char **words = malloc(1 * sizeof(*words)); 
    size_t counter = 0; 
    size_t array_size = 2; 


    for(int i = 0; i < 5; i++){ 
     if(!fgets(buffer, 103, stdin)){ 
      fputs("fgets failed", stderr); 
     } 
     words[counter] = buffer; 
     char **more_words = realloc(words, array_size * sizeof(*more_words)); 
     words = more_words; 
     array_size++; 
     counter ++; 
    } 
    printf("********************************************************"); 


    for(int i = 0; i < 5; i++){ 
     printf("%s\n", words[i]); 
    } 


} 

現在這是我工作的簡化代碼。 我知道我不會處理大量的錯誤,可以occour。C:Realloc的行爲方式,我不知道爲什麼

問題是,當你執行這個時,單詞數組似乎有5個條目的'最後'條目。

說你給與fgets:

1 
2 
3 
4 
5 

,然後

words[0] = 5; 
words[1] = 5; 
words[2] = 5; 
words[3] = 5; 
words[4] = 5; 

爲什麼不是:

words[0] = 1; 
words[1] = 2; 
words[2] = 3; 
words[3] = 4; 
words[4] = 5; 

回答

1
if(!fgets(buffer, 103, stdin)){ 
     fputs("fgets failed", stderr); 
} 
words[counter] = buffer; 

您有在呼喚fgets時,使words所有字符串有效地指向同一個字符數組,每次改寫一個緩衝區。試試這個:

if(!fgets(buffer, 103, stdin)){ 
     fputs("fgets failed", stderr); 
} 
// here make a new buffer and copy the string just read into it. 
char *new_buffer = malloc(strlen(buffer) + 1); 
strcpy(new_buffer, buffer); 
words[counter] = new_buffer; 
4

的問題是不是realloc,但你分配給你分配的指針是什麼:

words[counter] = buffer; 

buffer是相同的指針所有的時間,所以你最終用最後一個字符串讀入緩衝區。

您需要malloc和複製緩存的每一行:

words[counter] = malloc(strlen(buffer)+1); 
strcpy(words[counter], buffer); 

不用說,你應該NULL - 檢查分配回words之前realloc返回的值。

相關問題