2016-06-17 2 views
1

Ich versuche, Zahlen von anderen Zeichen in einer Zeichenfolge zu trennen, indem Sie sie in zwei separaten Arrays speichern. Wenn ich zum Beispiel 11 + 22 + 33 in die Konsole lege, sollte das Programm das Variablenarray als {11,22,33} und das Funktionsarray als {+, +} setzen.String-Parsing - Programm stürzt ab, wenn free() nach fehlgeschlagener Speicherreallokation oder Programmende aufgerufen wird.

Erstens schlägt meine Neuzuweisung für die Variablen immer (für mich) bei der 8. Neuzuweisung fehl. Dies an sich ist ein Problem, aber um diese potentielle Situation zu umgehen, sollte das Programm den gesamten Speicher freigeben und 1 zurückgeben. Stattdessen stürzt das Programm unter free() ab.

Das zweite Problem ist, wenn die Speicher Neuzuweisung nicht fehlschlägt, das Programm weiter bis zum Ende und stürzt dann erneut bei den free() Funktionen ab.

Ich glaube, es ist mit dem Überlauf des Speicherblocks zu tun (vergangene Erfahrung Intuition), aber ich kann nicht sehen, wo ich die letzte Speicherzelle überlaufen würde.

#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); 
} 
+2

Ich bin ziemlich sicher, dass 'sizeof (variables)' die Größe des Zeigers zurückgibt, nicht was er zeigt. –

+0

Natürlich tut es !! Vielen Dank. Wenn Sie eine Methode vorschlagen können, um die volle Länge des Speicherblocks zu erhalten und als eine Antwort zu setzen, wäre das großartig. – Hobojoe

+0

Schauen Sie sich diese URL an, um zu sehen, "Wie man die Größe des Speichers erreicht, auf den ein Zeiger zeigt?" http://stackoverflow.com/questions/24509509/how-to-get-the-size-of-memory-pointed-by-a-pointer –

Antwort

1

Ihre realloc ist die falsche Größe Zuweisung:

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

die tatsächliche Counter Rechnung

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

Zusätzlich sollten Sie die anderen realloc und verwenden ändern

if((function=realloc(function,fCounter*sizeof(char)))==NULL) 
nehmen sollte
+4

'realloc (Variablen, sizeof * Variablen * Counter)' ist weniger Fehler Lieber als 'realloc (Variablen, Counter * sizeof (double))' – chux

+2

@chux Ich sehe, mit Ihrer Lösung ist es nicht notwendig, den Typ des gespeicherten Zeigers zu wiederholen, wenn es später geändert werden könnte. Nett! – cwschmidt

+0

Beachten Sie auch Code-Review: Ich sehe 'Realloc (Variablen, Größe * Variablen * Counter)' und sagen "OK" und weitermachen. Ich sehe 'realloc (Variablen, Counter * sizeof (double))' und muss dann ungefähr 30 Zeilen nach 'double * variables = NULL;' suchen, um sein "OK" zu erfahren. – chux

Verwandte Themen