Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        2年前关闭。
                                                                                            
                
        
对于我正在开发的程序,我需要执行“字符串数学”,在给定两个字符串的情况下,我需要对字符串中的所有字符进行加法或减法以获得最终结果。

我在释放指针方面遇到问题,并且在理解如何在循环中使用指针时感到非常困惑。

目前我有:

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(结果,字符串A);

在功能上执行加法。

最佳答案

您的代码看起来并不很困惑。它看起来基本上是正确的。我看到一个未接打给free()的电话。在循环中,您调用calloc(),但从不在该内存上调用free()。如果在打印后不使用result,则可以在打印后将其释放:

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

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


可以在循环的每次迭代中分配和释放其他字符串,但是这会使程序运行更慢,并且无济于事。

如果使用valgrind这样的工具给您带来错误,则可能是performStringMath()中出现了问题。但是,如果没有该函数的代码,我们就无法真正说出它的含义。

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

10-12 16:06