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

C 这段代码中的内存错误在哪里?,c,malloc,dynamic-memory-allocation,calloc,C,Malloc,Dynamic Memory Allocation,Calloc,有人让我用C写这段代码作为练习。当他们查看我写的内容时,他们立即告诉我关于内存管理有一个巨大的错误。作为一个简单的练习,他们希望我找到并修复这个错误。我的知识一定有差距,或者我一定忽略了一些非常明显的东西,因为我一生都找不到它。如果有人能帮我解决这个问题,我将非常感激 代码如下: char int_to_char(int number){ if (number > 9) return (char)(((int)'A') + number - 10); else return

有人让我用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;
}
char int_到_char(整数编号){
如果(数字>9)返回(字符)((int)“A')+数字-10);
else返回(char)(((int)'0')+数字);
}
int change_base(字符*输出、int缓冲区大小、int十进制数、int base){
//检查有效参数
if((基值<2)| |(基值>26))返回-1;//范围错误
//就绪变量
int输出_i=0;
int tmp_字符串_i=0;
国际股息;
残炭;
char*tmp_string=calloc(缓冲区大小,sizeof(char));
memset(输出,'\0',缓冲区大小*大小(字符));
//检查负输入
如果(十进制数<0){
输出[0]='-';
股息=-十进制数;
输出_i++;
}
else红利=十进制数;
//查找数字
而(股息/基数!=0){
余数=整数到字符(股息百分比基数);
股息=股息/基数;
tmp_字符串[tmp_字符串_i]=余数;
tmp_字符串_i++;
如果(tmp_字符串_i+1>缓冲区大小){/+1表示额外的负号
自由(tmp_字符串);
return-2;//缓冲区大小错误
}
}
//将最后一位数字添加到字符串
余数=整数到字符(股息);
tmp_字符串[tmp_字符串_i]=余数;
//按相反顺序将tmp_字符串复制到输出
对于(;tmp_string_i>=0;tmp_string_i--){
输出[output_i]=tmp_字符串[tmp_字符串_i];
输出_i++;
}
自由(tmp_字符串);
返回0;
}
同样值得注意的是,我已经通过Valgrind运行了这段代码,以查找任何常见的内存错误,但它没有报告任何错误。我不太了解Valgrind的高级功能或细微差别

最后,对于如何提高代码的整体有效性和可读性,我非常乐意听取任何意见。

如果要说一个“巨大错误”,那么这个错误就是可怕的代码本身。:)l 因此,如果还有其他错误,那么事实上,在重写代码之前,不应该讨论这些错误

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

number = - number;
数字可以像以前一样为负数?:)

我认为“某人”指的是“你的字符串不是零的错误”。)考虑一个数字只有一个数字的情况,BuffelySosig等于1

为什么buffer\u size的类型是int而不是size\u t


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

实际上“巨大错误”不是很具体(甚至不客观),所以你应该问那个人他们认为你的代码有什么问题。我能看到的唯一一件让我感到困扰的事情是,你没有检查
calloc
是否真的成功。谢谢你的输入。我开始认为他们可能犯了一个错误。另外,我从反对票中感觉到这不是一个很好的问题(哈!)。我是否应该在codereview上发布此消息?您是否确实尝试过运行代码以查看发生了什么情况?是的,代码审查可能是一个更好的选择,因为这样做的目的更多地是帮助解决特定问题(例如,如果您遇到运行时错误或编译器错误,您无法理解),而不是尝试查找错误(甚至错误)“巨大的错误”,并不像人们想象的那么明显)@Ben Creighton-如果代码通过了所有的单元测试,并且没有使用代码分析工具报告错误,那么提交代码审查是有意义的。例如,
memset
\0
之后
calloc
是多余的。