这段代码中的内存错误在哪里?

时间:2014-10-20 19:07:12

标签: c malloc dynamic-memory-allocation calloc

有人让我把这段代码写成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的高级功能或细微差别。

最后,对于如何提高此代码的整体效果和可读性,我会非常高兴。

1 个答案:

答案 0 :(得分:0)

如果要说一个&#34;巨大错误&#34;那么这个错误就是糟糕的代码本身。:) 因此,如果存在其他错误,那么实际上它们不值得讨论,直到代码被重写为止。

例如,你知道如果某个整数是负数,那么在这样的语句之后

number = - number;

这个数字可以和之前一样?:)

我认为&#34;某人&#34;意味着&#34;巨大的错误&#34;你的字符串不是零地址。:)考虑一个情况,数字只有一位数,buffer_size等于1

为什么buffer_size的类型为int而不是size_t?

另外在我看来,为这样的转换分配额外的缓冲区是个坏主意。