gpt4 book ai didi

C-释放循环中分配的内存

转载 作者:行者123 更新时间:2023-11-30 20:04:12 27 4
gpt4 key购买 nike

对于我正在开发的程序,我需要执行“字符串数学”,其中给定两个字符串,我需要对字符串中的所有字符执行加法或减法以获得最终结果。

在释放指针方面我遇到了问题,并且在理解如何在循环中使用指针时感觉我真的陷入困境。

目前我有:

int main() {
char * input = (char *)malloc(sizeof(char)*1024);
char * stringA = (char *)malloc(sizeof(char)*64);
char * stringB = (char *)malloc(sizeof(char)*64);
char * result;
char operand;
int matched = 0;

while(fgets(input, 1024, stdin) != NULL) {
matched = sscanf(input, "%s %s %c", stringA, stringB, &operand);
if (matched == 3) {
if (strlen(stringA) < strlen(stringB)) {
stringA = balanceLengths(stringA, stringB);
} else if (strlen(stringA) > strlen(stringB)) {
stringB = balanceLengths(stringB, stringA);
}

result = (char *)calloc(strlen(stringA)+2, sizeof(char));
result = performStringMath(result, stringA, stringB, operand);

printf("%s\n", result);

}
}

//printf("%s\n%s\n", stringA, stringB);

free(input);
free(stringA);
free(stringB);
return 0;
}

而且我真的很难理解如何在循环的每次迭代中释放结果,因为如果我要在 printf 语句之后添加一个 free(result) ,我会从 valgrind 得到几个无效的读写错误,我如果我在循环之前为 calloc 分配内存,似乎也会遇到类似的错误。

其他方法:

    char * performStringMath(char *result, char *stringA, char *stringB, char operand) {
if (operand == '+') {
return performAddition(result, stringA, stringB);
} else if (operand == '-') {
return performSubtraction(stringA, stringB);
} else {
return 0;
}
}

char * balanceLengths(char *shorter, char *longer) {
int toAdd, i;
toAdd = (int)(strlen(longer) - strlen(shorter));
char *retString = (char *) malloc(sizeof(char) * strlen(longer)+ toAdd);

for (i = 0; i < toAdd; i++) {
retString[i] = '0';
retString[toAdd+i] = shorter[i];
}
return retString;
}

char * performSubtraction(char *stringA, char *stringB) {
return "";
}

char * performAddition(char *result, char *stringA, char *stringB) {
int carry, sum, i;
sum = 0;
carry = 0;
for (i = (int)strlen(stringA)-1; i >= 0; i--) {
sum = (stringA[i]-48) + (stringB[i]-48) + carry;
carry = 0;
if (sum >= 10) {
sum = sum-10;
carry = 1;
}
stringA[i] = (char)(sum+48);
}

if (carry != 0) {
result[0] = '1';
result = strcat(result, stringA);
} else {
result = stringA;
}

return result;
}

我实际上已经通过替换解决了这个问题

result = stringA; 

至 结果 = strcpy(结果, stringA);

在函数中执行加法。

最佳答案

您的代码看起来并不很困惑。看起来大部分是正确的。我发现缺少一个对 free() 的调用。在循环中,您调用 calloc(),但绝不对该内存调用 free()。如果您在打印结果后不打算使用结果,则可以在打印后将其释放:

        result = (char *)calloc(strlen(stringA)+2, sizeof(char));
result = performStringMath(result, stringA, stringB, operand);

printf("%s\n", result);
free(result);

其他字符串可以在循环的每次迭代中分配和释放,但这会使程序运行更慢并且没有任何帮助。

如果使用像 valgrind 这样的工具时出现错误,则可能是 performStringMath() 中出现问题。但是,如果没有该函数的代码,我们无法真正说出它可能是什么。

关于C-释放循环中分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43037931/

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