C:Realloc的表现方式让我无法弄清楚原因

时间:2016-04-30 08:34:00

标签: c pointers malloc realloc

#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]);
    }


}

现在这是我正在使用的简化代码。 我知道我不会处理很多可能出现的错误。

关键是,当你执行这个时,单词数组似乎有5个条目的&#39; last&#39;条目。

说你给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;

2 个答案:

答案 0 :(得分:4)

问题不是words[counter] = buffer; ,而是分配给你分配的指针:

buffer

malloc始终是相同的指针,因此您最终将最后一个字符串读入缓冲区。

您需要words[counter] = malloc(strlen(buffer)+1); strcpy(words[counter], buffer); 并复制每行的缓冲区:

NULL

不言而喻,您应该realloc - 检查words返回的值,然后再将其分配回<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

答案 1 :(得分:1)

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

每次调用fgets时都会覆盖一个缓冲区,以便words中的所有字符串有效地指向相同的char数组。试试这个:

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;