Как я могу улучшить его, чтобы сэкономить память?
Как написано, ваше сообщение включает несколько экземпляров вызовов на calloc()
, каждый из которых создает кучную память, но ни одна из созданной памяти не освобождается, что приводит к утечке памяти.Как минимум, ответом на ваш вопрос будет просто сделать соответствующий звонок на free()
для каждого звонка на malloc()
.
Кстати, есть хорошие дискуссии о том, когда, где и как использовать динамически выделенную память здесь и здесь .
Ниже приведено упрощение функции addNumbers
при сохранении ее первоначального прототипа.Как просили в комментариях, он использует ANSI C без дополнительных библиотек.Помимо прочего, он также имеет встроенную реверсивность строк (исключая функцию strrev()
), использует только один экземпляр динамически выделяемой памяти и не пропускает ни одной.Раскомментируя функции scanf()
и добавляя входные данные командной строки, его можно легко преобразовать в соответствии с вашими потребностями.
char* addNumbers(char* s1, char* s2) ;
int main(int argc, char *argv[])
{
char s1[101] = {"150353265326"};
char s2[101] = {"22055653351"};
// Expect: 3316139500221184007426
//scanf(" %s",s1);
//scanf(" %s",s2);
char * result = addNumbers(s1, s2);
printf("%s\n", result);
free(result);
return 0;
}
char* addNumbers(char* s1, char* s2)
{
int i=0, j=0, tmp;
int l1 = strlen(s1);
int l2 = strlen(s2);
int a[100]={0},b[100]={0};
int ans[200] = {0};
char *result = calloc(l1+l2+1, 1);
for(i = l1-1,j=0;i>=0;i--,j++)
{
a[j] = s1[i]-'0';
}
for(i = l2-1,j=0;i>=0;i--,j++)
{
b[j] = s2[i]-'0';
}
for(i = 0;i < l2;i++)
{
for(j = 0;j < l1;j++)
{
ans[i+j] += b[i]*a[j];
}
}
for(i = 0;i < l1+l2;i++)
{
tmp = ans[i]/10;
ans[i] = ans[i]%10;
ans[i+1] = ans[i+1] + tmp;
}
for(i = l1+l2; i>= 0;i--)
{
if(ans[i] > 0)
break;
}
for(j=i;j >= 0;j--)
{
result[i-j] = (char)('0' + ans[j]);
}
return result;
}
Протестировано с использованием входов командной строки:
![enter image description here](https://i.stack.imgur.com/UF7nH.jpg)
Примечание. Эта адаптация дает кредит этойреализация.