Realloc 2d массив символов - PullRequest
0 голосов
/ 04 мая 2018

У меня есть двумерный динамически размещенный массив символов char, который должен содержать строки из файла (stdin) до пробела. Поскольку я не знаю, сколько строк в файле, я постоянно перераспределяю большие куски памяти для 2d массива, поэтому у меня достаточно места для хранения каждой отдельной строки. Например, если я введу «hello world» в качестве входных данных для программы, я ожидаю, что «h» будет напечатано, поскольку hello будет первой строкой, а h будет первым символом этой строки.

size_t size_buffer = 1;
char* buffer = (char*) malloc(size_buffer * sizeof(char)); //initial allocation that can hold 1 single char
size_t cur_nchars = 0; //number of characters read in current string

size_t size_words = 1; //initially only hold 1 string
char** words = (char**) malloc(size_words * sizeof(char*));
size_t cur_nwords = 0; //number of strings read

char read;
while ((read = getchar()) != EOF && !ferror(stdin)) {   
    if (read == ' ') { //space character
        //printf("reached a space character\n");
        words[cur_nwords] = buffer; //store string into words string array
        cur_nwords++; //increase number of words stored
        if (cur_nwords == size_words) { //maximum size hit
            size_words *= 2; //multiply old size by 2
            char** temp_words = (char**) realloc(words, size_words); //realloc new array twice as big

            if (!temp_words) {
                printf("can't allocate more memory");
                for (size_t i = 0; i < cur_nwords; ++i) {
                    free(words[i]);
                }
                free(words);
                exit(1);
            }
            else
                words = temp_words; //have old point to new
        }
        buffer = NULL;
        buffer = (char*)malloc(sizeof(char));
        cur_nchars = 0;
        continue;
    }
    if (cur_nchars == size_buffer) { //maximum length of string reached
        size_buffer *= 2; //new max length is doubled
        char* temp = realloc(buffer, size_buffer); //reallocate memory
        if (!temp) {
            printf("can't allocate more memory");
            free(buffer);
            exit(1);
        }
        else {
            buffer = temp; //set buffer to point to same location as temp
        }
    }
    buffer[cur_nchars] = read; //store character in char array
    cur_nchars++;   //increase # chars in string
}
printf("%c", words[0][0]); //throws error!

Однако после того, как код выходит из этого цикла, содержимое слов 2d-массива почему-то стирается (не может прочитать ошибку памяти) ... У меня такое ощущение, что я не перераспределяю память для 2d массив правильно. Нужно ли перераспределять сами строки массива char, когда я перераспределяю 2d массив, если длина самих строк не меняется?

...