-1
有人問我用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的高級功能或細微差別不甚瞭解。
最後,我會非常樂意提供關於如何提高此代碼的整體有效性和可讀性的任何意見。
「巨大的錯誤」實際上並不是非常具體(甚至沒有客觀),所以你應該問那個人他們認爲你的代碼有問題。我唯一能看到的就是通過查看它而困擾我的是,你不檢查'calloc'是否確實成功了。 – UnholySheep 2014-10-20 19:15:44
感謝您的輸入。我開始認爲他們可能犯了一個錯誤。另外,我從關注中感覺到這不是一個很好的問題(哈!)。我應該在codereview上發佈這個嗎? – 2014-10-20 19:33:13
您是否真的嘗試過運行代碼以查看會發生什麼? – dbc 2014-10-20 19:34:51