gpt4 book ai didi

c - 这段代码内存错误在哪里?

转载 作者:行者123 更新时间:2023-11-30 19:45:25 25 4
gpt4 key购买 nike

有人让我用 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 的高级功能或细微差别。

最后,如果您对如何提高此代码的整体有效性和可读性提出任何评论,我将非常高兴。

最佳答案

如果要说一个“巨大错误”,那么这个错误就是可怕的代码本身。:)l因此,如果存在其他错误,那么实际上在重写代码之前不值得讨论它们。

例如,您是否知道如果某个整数为负数,则在这样的语句之后

number = - number;

数字可以像以前一样为负数吗?:)

我认为“某人”的意思是“巨大错误”,即您的字符串不是零终止的。:)考虑一种情况,其中数字只有一位数字并且 buffer_size 等于 1

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

另外,我认为为此类转换分配额外的缓冲区是一个坏主意。

关于c - 这段代码内存错误在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26473116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com