Я не очень профессиональный на 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
В нем говорится, что проблема связана с функцией 'commandHandler'. Как вы ожидаете, что мы скажем что-нибудь разумное в отношении этой функции, если вы не представите ее нам? –
Извините, я забыл команду Хандлера. Я редактировал сообщение. – uskrd
'command' - NULL, то есть ошибка. Нет ничего похожего на вызов по ссылке в C. Вы отправили значение команды в функцию, и если она там изменена, это локальная копия, которая изменяется не на исходную переменную. – Marian