C 这段代码中的内存错误在哪里?
有人让我用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
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
是多余的。