누군가이 코드를 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의 고급 기능이나 뉘앙스에 대해서는 잘 모릅니다.마지막으로이 코드의 전반적인 효율성과 가독성을 향상시킬 수있는 방법에 대한 의견이 있으면 매우 기쁩니다.
"거대한 오류"는 실제로 매우 구체적이지 않으며 객관적이지는 않으므로 코드에 잘못되었다고 생각하는 사람에게 물어보십시오. 내가보기에 단지 그것을 보면서 나를 괴롭힐 수있는 유일한 사실은'calloc'이 실제로 성공했는지 여부를 확인하지 않는다는 것입니다. – UnholySheep
입력 해 주셔서 감사합니다. 나는 그들이 실수했을 수도 있다고 생각하기 시작했습니다. 또한, 나는 downvotes에서 이것이 아주 좋은 질문이 아니라고 느낍니다 (하!). 내가 codereview에서 이것을 게시해야합니까? –
실제로 코드를 실행하여 어떤 결과가 발생했는지 확인해 보셨습니까? – dbc