有人让我把这段代码写成C语言。当他们查看我写的内容时,他们立即告诉我内存管理存在很大的错误。作为一个简单的练习,他们希望我找到并修复这个错误。我的知识肯定存在差距,或者我必须忽略一些非常明显的东西,因为我无法为我的生活找到它。如果有人能帮助我搞清楚,我会非常感激。
以下是代码:
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运行此代码来查找任何常见的内存错误,但它报告没有错误。我不太了解Valgrind的高级功能或细微差别。
最后,对于如何提高此代码的整体效果和可读性,我会非常高兴。
答案 0 :(得分:0)
如果要说一个&#34;巨大错误&#34;那么这个错误就是糟糕的代码本身。:) 因此,如果存在其他错误,那么实际上它们不值得讨论,直到代码被重写为止。
例如,你知道如果某个整数是负数,那么在这样的语句之后
number = - number;
这个数字可以和之前一样?:)
我认为&#34;某人&#34;意味着&#34;巨大的错误&#34;你的字符串不是零地址。:)考虑一个情况,数字只有一位数,buffer_size等于1
为什么buffer_size的类型为int而不是size_t?
另外在我看来,为这样的转换分配额外的缓冲区是个坏主意。