2014-01-24 1 views
1

저는 C에서 전문가가 아니기 때문에 valgrind에 문제가 있습니다.함수 내 malloc/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; 
} 

하지만 오류 반환 값은 없습니다.

내가 참조로 전화를 걸면 나는 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 

내가 전혀 모르는 :

//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 라인 1199 if (strcmp(command, "thing_to_compare") == 0)

Valgrind의입니다.

종류의, 당신은 것을 역 참조하는 필립

+1

문제는 'commandHandler'라는 함수에 있다고합니다. 당신이 우리에게 보여주지 않으면 그 기능에 대해 합리적으로 말하는 것을 어떻게 기대합니까? –

+0

죄송합니다. commandHandler를 잊어 버렸습니다. 나는 그 지위를 편집했다. – uskrd

+1

'command'가 NULL이면 오류입니다. C에서 참조로 호출하는 것과 같은 것은 없습니다. 명령의 값을 함수에 보내고 거기에서 변경된 경우 원래 변수가 아닌 로컬 복사본입니다. – Marian

답변

3

getUserInput이 모든 기능을 패스에 의해 가치 C.에 따라서 모든 strcmp 기능에 도착하면 한, command의 값을 변경할 수있는 방법이 없습니다에 관하여 NULL 포인터로 인해 모든 종류의 불량 항목이 발생합니다. 당신이 command의 값을 변경할 수 있도록 getUserInput를 원하는 경우에

, 당신은 (다음 char** 인수를 수행해야하는 기능을 의미) 함수에 command의 주소를 통과해야합니다.

+0

고맙습니다, 그래서 지금 나는이 같은 가치를 전달해야합니까? 'getUserInput (& command); 그리고'int getUserInput (char ** name)'함수에서? 내가 이해하지 못하는 것은 함수 안에서'name'에 접근하는 방법입니다. 모든 'name'을'* name'으로 변경 하시겠습니까? 이렇게하면 세그멘테이션 오류가 발생합니다. – uskrd

+0

개별 문자를 할당 할 때 작업 순서를 일관되게 유지하려면'(* name) [count]'와 같은 작업을 수행해야합니다. – tabstop

+0

중괄호로 해결했습니다. 고맙습니다! – uskrd