2016-04-30 58 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返回的值。

相关问题