2012-01-09 2 views
-2

Я пытаюсь сохранить динамически выделенный массив строк, которые считываются с использованием системного вызова read в c. Вот небольшой пример того, что я пытаюсь сделать:calloc/malloc и читать странное поведение?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

void processInput() { 
    char ** array = (char **) calloc(20, sizeof(char*)); 
    int arrayIndex = 0; 
    while(1) { 
     printf("Type something: "); 
     fflush(stdout); 

     char* buffer; 
     int readResult = read(0, buffer, 100); 

     array[arrayIndex] = (char*)calloc(readResult, sizeof(char)); 
    } 
}  

Однако, это вызывает какие-то странные вопросы:

 

    Type something: a 
    Type something: Type something: a 
    Type something: Type something: abcdefg 
    Type something: Type something: Type something: Type something: Type something: Type something: Type something: Type something: 

Есть ли объяснение этому? Я не могу понять, почему это происходит.

+3

'char * buffer; readResult = read (0, buffer, 100); 'Использование неинициализированных переменных - особенно неинициализированных указателей - может только закончиться слезами. –

+1

Вы не наращиваете 'arrayIndex' – Kevin

+0

К сожалению, пример был несколько неаккуратным. вы правы, что я не увеличивал числовое значение arrayIndex, но это не было важно для примера. Однако на практике вы на 100% правильны, что arrayIndex нужно будет увеличивать. В противном случае он не будет хранить ничего, кроме последнего добавленного элемента в индексе 0: P. – Ryan

ответ

2

Заменить:

char *buffer; 

с:

char buffer[100]; 

Размерность согласуется с аргументом read(), но ваша строка не будет нулевым завершенного read(), так что вы можете предпочесть выделить 101 байт вместо этого и принудительно отменяет его. Вы должны подумать об этом дополнительном байте при распределении пространства.

Обратите внимание, что выделенное пространство не используется.

Перед использованием вы всегда должны проверять распределение памяти.

Поскольку вы выделяете только 20 указателей перед циклом, цикл while (1) опасен и может позволить вам растоптать намного выше выделенного пространства, если пользователь вводит более 20 строк данных.

(Обратите внимание, что если пользователь перенаправляет входные данные из файла, вы не будете читать 20 строк, вы будете читать 2000 символов в 20 блоках по 100 символов, символы новой строки и т. Д., А затем переходить в зону крушения.)

0

От взгляда на ваш выход это похоже на то, что он проходит через цикл для каждого символа на входе.

Смежные вопросы