2016-04-30 9 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]); 
    } 


} 

これは作業中の簡略化されたコードです。 私は、多くのエラーを処理できないことを知っています。C:Reallocの動作がわからない理由

これはあなたがこれを実行すると、単語配列には「最後の」エントリの5つのエントリがあるようです。その後、

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; 

あなたはfgetsのを与えると言いますか?

答えて

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

あなたはwords内のすべての文字列が効果的に同じchar型の配列を指すように、fgetsを呼び出すたびに上書きされている1つのバッファを持っています。これを試してみてください:

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); 

それはあなたが戻っwordsに割り当てる前にreallocによって返された値を-checking NULLなければならないことは言うまでもないです。

関連する問題