2014-10-20 61 views
-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的高級功能或細微差別不甚瞭解。

最後,我會非常樂意提供關於如何提高此代碼的整體有效性和可讀性的任何意見。

+0

「巨​​大的錯誤」實際上並不是非常具體(甚至沒有客觀),所以你應該問那個人他們認爲你的代碼有問題。我唯一能看到的就是通過查看它而困擾我的是,你不檢查'calloc'是否確實成功了。 – UnholySheep 2014-10-20 19:15:44

+0

感謝您的輸入。我開始認爲他們可能犯了一個錯誤。另外,我從關注中感覺到這不是一個很好的問題(哈!)。我應該在codereview上發佈這個嗎? – 2014-10-20 19:33:13

+0

您是否真的嘗試過運行代碼以查看會發生什麼? – dbc 2014-10-20 19:34:51

回答

0

如果要說一個「巨大的錯誤」,那麼這個錯誤就是糟糕的代碼本身。:)所以如果還有其他錯誤,那麼實際上他們不值得討論,直到代碼被重寫。

例如,你知道,如果一些整數爲負,那麼這樣的

number = - number; 

語句後數可以像以前那樣消極?:)

我認爲「某人」的意思「巨大的錯誤」,你的字符串沒有被零分。:)考慮一種情況,數字只有一個數字,buffer_size等於1

爲什麼buffer_size的類型是int而不是size_t?

同樣在我看來,爲這樣的轉換分配額外的緩衝區是一個壞主意。