2014-10-20 4 views
-1

누군가이 코드를 C의 연습 문제로 써달라고 부탁했습니다. 내가 작성한 내용을 살펴본 후 그들은 즉시 메모리 관리와 관련하여 큰 오류가 있음을 알려 줬습니다. 간단한 연습으로, 나는이 오류를 찾아서 해결하기를 원했습니다. 내 지식에 틈이 있어야합니다. 그렇지 않으면 저의 삶에서 찾을 수 없기 때문에 나는 아주 명백한 것을 간과해야합니다. 누군가가 알아낼 수 있다면, 나는 매우 감사 할 것입니다. , 내가 어떤 일반적인 메모리 오류를 찾기 위해 Valgrind의를 통해이 코드를 실행 한 노트의이 코드의 메모리 오류는 어디에 있습니까?

char int_to_char(int number){ 
    if (number > 9) return (char)(((int)'A') + number - 10); 
    else return (char)(((int)'0') + number); 
} 

int change_base(char* output, int buffer_size, int decimal_number, int base){ 
    //check for valid parameters 
    if((base < 2) || (base > 26)) return -1;  //range error 

    //ready variables 
    int output_i = 0; 
    int tmp_string_i = 0; 
    int dividend; 
    char remainder; 
    char * tmp_string = calloc(buffer_size, sizeof(char)); 
    memset(output, '\0', buffer_size*sizeof(char)); 

    //check for negative input 
    if(decimal_number < 0){ 
     output[0] = '-'; 
     dividend = -decimal_number; 
     output_i++; 
    } 
    else dividend = decimal_number; 

    //find digits 
    while(dividend/base != 0){ 
     remainder = int_to_char(dividend % base); 
     dividend = dividend/base; 
     tmp_string[tmp_string_i] = remainder; 
     tmp_string_i++; 
     if(tmp_string_i + 1 > buffer_size){  //+1 for the extra negative sign 
      free(tmp_string); 
      return -2;  //buffer size error 
     } 
    } 
    //add last digit to string 
    remainder = int_to_char(dividend); 
    tmp_string[tmp_string_i] = remainder; 

    //copy tmp_string to output in reverse order 
    for(; tmp_string_i >= 0; tmp_string_i--){ 
     output[output_i] = tmp_string[tmp_string_i]; 
     output_i++; 
    } 
    free(tmp_string); 
    return 0; 
} 

는 또한 가치,하지만 오류를보고하지 : 여기

는 코드입니다. Valgrind의 고급 기능이나 뉘앙스에 대해서는 잘 모릅니다.

마지막으로이 코드의 전반적인 효율성과 가독성을 향상시킬 수있는 방법에 대한 의견이 있으면 매우 기쁩니다.

+0

"거대한 오류"는 실제로 매우 구체적이지 않으며 객관적이지는 않으므로 코드에 잘못되었다고 생각하는 사람에게 물어보십시오. 내가보기에 단지 그것을 보면서 나를 괴롭힐 수있는 유일한 사실은'calloc'이 실제로 성공했는지 여부를 확인하지 않는다는 것입니다. – UnholySheep

+0

입력 해 주셔서 감사합니다. 나는 그들이 실수했을 수도 있다고 생각하기 시작했습니다. 또한, 나는 downvotes에서 이것이 아주 좋은 질문이 아니라고 느낍니다 (하!). 내가 codereview에서 이것을 게시해야합니까? –

+0

실제로 코드를 실행하여 어떤 결과가 발생했는지 확인해 보셨습니까? – dbc

답변

0

"거대한 오류"에 대해 말하면이 오류는 끔찍한 코드입니다. :) 다른 오류가있는 경우 실제로 코드를 다시 작성해야만 토론 할 수 있습니다.

는 예를 들어, 당신은 어떤 정수는 다음이

number = - number; 

같은 문 뒤에 음수 인 경우 숫자가 음수 이전과 같이 될 수 있음을 알 수 있습니까? :

나는 "누군가가"의미 있다고 생각 당신의 문자열이 제로 - 지장이 없다는 것을 "큰 오류"라고 생각하십시오. 숫자에 숫자가 하나 밖에없고 buffer_size가 1 인 경우를 고려하십시오.

왜 buffer_size는 size_t 대신 int 유형을 사용합니까?

제 의견으로는 그러한 변환을 위해 추가 버퍼를 할당하는 것은 좋지 않습니다.

관련 문제