字符串解析 - 在内存重新分配失败或程序结束后调用free()时程序崩溃。

时间:2016-06-17 19:24:12

标签: c

我试图通过将数字存储在两个单独的数组中来将数字与字符串中的其他字符分开。例如,如果我将11 + 22 + 33放入控制台,则程序应将变量数组设为{11,22,33},将函数数组设为{+,+}。

首先,我在第8次重新分配时对变量的重新分配总是失败(对我自己而言)。这本身就是一个问题,但是为了尝试处理这种潜在的情况,程序应该释放所有使用的内存并返回1.相反,程序在free()处崩溃。

第二个问题是如果内存重新分配没有失败,程序会继续结束,然后再次在free()函数崩溃。

我认为这与过度运行内存块(过去的经验直觉)有关,但是我无法看到我将在哪个超出最后一个内存单元格。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int functionLocation,i, Counter=0,fCounter=0,vCounter=0;
    double *variables=NULL;
    char *function=NULL,input[100], *parsed,Test;
    //allow variable number of inputs

    if((variables=calloc(1,sizeof(double)))==NULL)
    {
        printf("Memory allocation failed - Variables");
        return(1);
    }
    if((function=calloc(1,sizeof(char)))==NULL)
    {
        printf("Memory allocation failed - Functions");
        return(1);
    }


    //get user input
    printf("Calculator. Please enter the equation.\n");
    fgets(input,sizeof(input),stdin);

    //determine first number, determine function, determine second number
    parsed=input;
    while((Test=*parsed)!='\n' && Test!=EOF && (vCounter<100))
    {
        vCounter++;
        // Determines if character is a digit, if yes it converts the digits into a number.
        // If no it stores the character in a separate array.
        if(isdigit(*parsed))
        {
            variables[Counter]=strtod(parsed,&parsed);
            Counter++;
            if((variables=realloc(variables,sizeof(variables)+sizeof(double)))==NULL)
               {
                   printf("Memory reallocation failed - Variables");
                   free(variables);
                   free(function);
                   return(1);
               }
        }
        else
        {
            printf("%d\n",fCounter);
            if((function=realloc(function,sizeof(function)+sizeof(char)))==NULL)
               {
                   printf("Memory reallocation failed - Functions");
                   free(function);
                   free(variables);
                   return(1);
               }

            function[fCounter]=*parsed;
            fCounter++;
            parsed++;
        }
    }


free(variables);
free(function);

return(0);
}

1 个答案:

答案 0 :(得分:1)

您的realloc分配的内容错误:

if((variables=realloc(variables,sizeof(variables)+sizeof(double)))==NULL)

应考虑实际的Counter

if((variables=realloc(variables,Counter*sizeof(double)))==NULL)

此外,您应该更改另一个realloc并使用

if((function=realloc(function,fCounter*sizeof(char)))==NULL)