2013-12-02 6 views
0

Я пытаюсь получить неограниченный ввод от пользователя, используя realloc. это то, что я сделал до сих пор:что не так с этим использованием realloc

int getCharactersFromUser(char* arr,char terminator) 
{ 
char c = getch(); 
int length =0; 
while(c!=terminator) 
    { 
    arr = realloc(arr, sizeof (arr)*(++length)); 
    arr[length-1]=c; 
    c = getch(); 
    } 
return length; 
} 

я называю этот метод с обр как это: char *unknownArr = calloc(0,sizeof *unknownArr); int length = getCharactersFromUser(&unknownArr,TEMINATOR_FOR_LIST); здесь TEMINATOR_FOR_LIST является eof

+2

Посмотрите, какое значение имеет 'sizeof (arr)'. – this

+2

Также: если вы хотите использовать 'EOF', вам понадобится' int' для ваших персонажей. 'EOF' не гарантированно помещается внутри' char'. – Kninnug

ответ

7

Если вы хотите изменить копию вызывающего абонента из arr, что вам нужно для передачи указателя на указатель.

Также sizeof (arr) дает вам char*; ваш код, как представляется, принимает sizeof(char). Это гарантированно будет 1, позволяя упростить расчет размера памяти.

int getCharactersFromUser(char** arr,char terminator) 
{ 
    *arr = NULL; // first call to realloc will crash if `*arr` is uninitialised in caller 
    char c = getch(); 
    int length =0; 
    while(c!=terminator) 
    { 
     *arr = realloc(*arr, ++length); 
     (*arr)[length-1]=c; 
     c = getch(); 
    } 
    return length; 
} 
+2

Это также похоже на ситуацию, когда было бы лучше перераспределить силы в два раза, удваивая каждый раз. (Конечно, это означает, что между перераспределениями может быть прочитано более одного символа.) –

+0

Вместо * arr = NULL, который имеет потенциал для утечки, я использовал бы, если (! * Arr) * arr = malloc (1); Кроме того, что @JoshuaTaylor сказал. if (maxlen == curlen) * arr = realloc (* arr, (maxlen * = 2)); – ciphermagi

+1

@JonahNelson Ваша версия сработает, если будет передан неинициализированный указатель. OP должен будет выбрать, какая из форм неправильного использования должна защищать и документировать его/ее функцию соответствующим образом. – simonc

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