C Fehlersuche, segmentation fault...

luke8800gts

Ensign
Registriert
Dez. 2010
Beiträge
191
Grüße,
Kann mir jemand beim Fehlersuchen helfen, die Segmentation fault bringt mich zum verzweifeln...
Es muss an der void inverse liegen, da diese auskommentiert funktioniert :)
Ich hoff, dass ich nicht blinder total was überseh...
Danke im Voraus

Ps: Überlest die Kommentare, die hab ich nur aus lernzwecken...

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

#define BUFFER 80 //constanten buffer def

/*immer nur um ein byte zu reallocieren ist zu ineffizient*/

void mystarcat(char *a, char *b)
{
  while(*a) a++;
  //solang der pointer auf a zeigt eine Adressstelle weiter
  while (*b) *(a++) = *(b++);
  //wenn a fertig, wird die Adressstelle danach immer mit b abgeglichen!
  //Zum Glück ist google my friend :D
}

void inverse(char *a)
{
  char *tmp = *a;
  while (*a) a++;
  while (*tmp) *(tmp++) = *(a--);
  }



int main ()
{
  char buffer[BUFFER];
  size_t contentSize = 1; //wegen nullbyte...
  
  char *content = malloc(sizeof(char) * BUFFER);
  /*von rechts nach links...
  malloc reserviert den Speicher und pointer content zeigt auf den Ort */

  if(content == NULL) //wenn nicht genug speicher...
  {
    printf("Failed to allocate content");
    return 1;
  }
  content[0] = '\0'; /*falls im Textdokument nichts steht, mit Nullstelle
                    abgeschlossen...*/

  while(fgets(buffer, BUFFER, stdin)) 
  //fgets nimmt das file von "< filename.txt
  //schreibt in buffer, einzulesenden Zeichen, art des inputs
  
  {
    char *old = content;              
    //auch old auf contentOrt, denn wenn Content = Null
    
    contentSize += strlen(buffer);
    //größerer buffer
    
    content = realloc(content, contentSize);
    if(content == NULL)
    {
      printf("Realocation faild");
      free(old);
      return 2;
    }
    mystarcat(content, buffer);
}

if(ferror(stdin))
//wenn ungültiger Input
{
    free(content);
    printf("Willst du mich auf den Arm nehmen!?");
    return 3;
}
 
inverse(content);
printf("%s\n", content);
free(content);
return 0;
}

Das Progamm soll durch die Console einen Text einlesen und dann invertiert ausgeben...
 
Zuletzt bearbeitet:
Schonmal einen Debugger benutzt? Bei Speicherfehlern ist valgrind auch immer zu empfehlen.

€: Und dem Ersten, der ihm ohne dass er eine eigene Leistung erbringen muss einfach sagt, was er zu was ändern muss, flitsche ich einmal kräftig gegen das Ohrläppchen!
 
Zuletzt bearbeitet:
In der inverse() Funktion das "char *tmp = *a;" mit "char *tmp = a;" ersetzen.
 
MichaelV8 schrieb:
In der inverse() Funktion das "char *tmp = *a;" mit "char *tmp = a;" ersetzen.

Du bist der Grund, warum wir nichts schönes auf der Welt haben können. Sei froh, dass das Flitschen nur eine leere Drohung war.
 
asdfman schrieb:
Du bist der Grund, warum wir nichts schönes auf der Welt haben können. Sei froh, dass das Flitschen nur eine leere Drohung war.

Selbst wenn nicht, interessieren mich deine Phrasen nicht das Geringste.
 
Zuletzt bearbeitet:
Mal noch 'ne Anmerkung von mir.

Code:
char *content = malloc(sizeof(char) * BUFFER);

Wozu die Multiplikation mit sizeof(char)? Sorgst du dich, daß sizeof(char) irgendwann mal was anderes als 1 sein könnte? ;)
 
ooh, ok... hmm... wie funktioniert das jetzt?
Weil es auf die Adresse zeigen muss...
Aber dann ist ja im Grunde falsch, denn ich brauch doch ein tmp Arrey...
oder?
Da muss ich doch gleich anders vorgehen...

Jaa sizeof :) da hast du natürlich recht, aber bei einem Übungsbeispiel kann man es schon mal ausprobieren ;)
 
eine kleine warnung bezüglich sizeof(char) in C:

Code:
#include <stdio.h>

int main() {
   printf("%d\n",sizeof(char));
   printf("%d\n",sizeof('a'));
   return 0;
}

kann
Code:
1
4
ausgeben, weil char-literale in C ints sind.
 
luke8800gts schrieb:
ooh, ok... hmm... wie funktioniert das jetzt?
Weil es auf die Adresse zeigen muss...
Aber dann ist ja im Grunde falsch, denn ich brauch doch ein tmp Arrey...
wenn das tmp in inverse() ein eigenes Array sein soll, musst du ein neues Array allokieren, so im Stil von
Code:
char* tmp = (char)* malloc(...);
Und nicht vergessen, das auch irgendwann wieder freizugeben. Alternativ kannst du tmp auch als Puffer fester Größe realisieren:
Code:
char temp[100];
musst dann halt nur wissen, wie groß die zu invertierenden Strings werden können, um die Puffergröße entsprechend zu wählen.
 
Zurück
Oben