2014-01-24 2 views
1

Я не очень профессиональный на C, и поэтому у меня проблема с valgrind.malloc inside function/call-by-reference/valgrind

Я хочу прочитать вход из командной строки.

Если я попробую так, все будет хорошо.

//call the function 
char *command = getUserInput(); 


//function 
char *getUserInput() 
{ 
    char *buffer = NULL; 
    char *temp = NULL; 
    unsigned int count = 0; 
    unsigned int lenght = 10; 
    char character = 0; 

    buffer = malloc((lenght+1)*sizeof(char)); 
    if(buffer == NULL) 
    { 
    // printf(ERROR_OUT_OF_MEM); 
    // return EXIT_OUT_OF_MEM; 
    } 

    while((character = getchar()) != '\n') 
    { 
    if(count == lenght) 
    { 
     lenght += 10; 
     temp = realloc(buffer,lenght*sizeof(char)); 
     if(temp != NULL) 
     { 
      buffer = temp; 
     } 
     else 
     { 
      free (buffer); 
      // printf(ERROR_OUT_OF_MEM); 
      // return EXIT_OUT_OF_MEM; 
     } 
    } 

    buffer[count] = character; 
    count++; 

    } 
    buffer[count] = '\0'; 

    return buffer; 
} 

Но я не могу получить ошибку-returnvalue.

Если я попробую сделать это путем вызова по ссылке, я получаю ошибку valgrind, которую я не понимаю. И я знаю, в этом примере-function-call я не запрашиваю возвращаемое значение.

//call function 
char *command = NULL; 
getUserInput(command); 

//function 
int getUserInput(char *name) 
{ 
    char *temp = NULL; 
    unsigned int count = 0; 
    unsigned int lenght = 10; 
    char character = 0; 

    name = malloc((lenght+1)*sizeof(char)); 
    checkMemory(name); 

    while((character = getchar()) != '\n') 
    { 
    if(count == lenght) 
    { 
     lenght += 10; 
     temp = realloc(name,lenght*sizeof(char)); 
     if(temp != NULL) 
     { 
      name = temp; 
     } 
     else 
     { 
      free (name); 
      printf(ERROR_OUT_OF_MEMORY_MESSAGE); 
      return ERROR_OUT_OF_MEMORY; 
     } 
    } 

    name[count] = character; 
    count++; 

    } 
    name[count] = '\0'; 

    return RETURN_SUCCESS; 
} 

CommandHandler-Line 1199 является if (strcmp(command, "thing_to_compare") == 0)

Valgrind:

==23886== Use of uninitialised value of size 4 
==23886== at 0x40256BB: strcmp (mc_replace_strmem.c:426) 
==23886== by 0x8049B39: commandHandler (assa.c:1199) 
==23886== by 0x8049D6C: main (assa.c:1295) 
==23886== Uninitialised value was created by a stack allocation 
==23886== at 0x8049B00: commandHandler (assa.c:1189) 
==23886== 
==23886== Invalid read of size 1 
==23886== at 0x40256BB: strcmp (mc_replace_strmem.c:426) 
==23886== by 0x8049B39: commandHandler (assa.c:1199) 
==23886== by 0x8049D6C: main (assa.c:1295) 
==23886== Address 0x0 is not stack'd, malloc'd or (recently) free'd 

Я совершенно не знаю, где проблема.

вид касается Philipp

+1

В нем говорится, что проблема связана с функцией 'commandHandler'. Как вы ожидаете, что мы скажем что-нибудь разумное в отношении этой функции, если вы не представите ее нам? –

+0

Извините, я забыл команду Хандлера. Я редактировал сообщение. – uskrd

+1

'command' - NULL, то есть ошибка. Нет ничего похожего на вызов по ссылке в C. Вы отправили значение команды в функцию, и если она там изменена, это локальная копия, которая изменяется не на исходную переменную. – Marian

ответ

3

getUserInput не имеет возможности изменить значение command, так как все функции проходят по значению в C. Таким образом, когда вы получаете все ваши strcmp функции, вы разыменования, что NULL указатель вызывает всевозможные плохие вещи.

Если вы хотите getUserInput, чтобы иметь возможность изменить значение command, необходимо передать адрес command функции (что означает функцию должна затем взять char** аргумент).

+0

Спасибо, так что теперь я должен передать значение, как это? 'getUserInput (& command);' и в функции 'int getUserInput (char ** name)'? Я не понимаю, как получить доступ к 'name' внутри функции. Изменить каждое 'имя' на' * name'? Если я это сделаю, у меня возникнет ошибка сегментации. – uskrd

+0

Когда вы получаете назначение отдельных символов, вам нужно сделать что-то вроде '(* name) [count]', чтобы сохранить порядок операций в строке. – tabstop

+0

Скобки решили это. Спасибо! – uskrd