Eine Liste erstellen



  • Hast du den Fehler gefunden, läuft es schon?? Würde gerne wissen wie es dir mit deinem C Programm geht.

    Lg THE_ONE



  • Hallo,

    ich habe mir eure Codes nicht ganz genau angesehen, aber zur Unterstützung der Heap-Fehlersuche:

    Alle Codes übertreten den von malloc erhaltenen Speicherblock, und zwar in der Funktion addstring hier:

    strcpy(Array[NumberOfStrings],String);
    

    und bei der Nullterminierung von guess hier:

    guess[strlen(solution)] = '\0'
    

    In beiden Fällen ist der von malloc besorgte Speicher um eine Position zu klein ausgefallen 😉

    THE_ONE schrieb:

    [...]verstehe aber nicht warum bei dir das EndOfString überhaupt fehlt

    Woher soll denn die abschliessende Null kommen? malloc tut das jedenfalls nicht, also muss man sich selber darum kümmern, wenn man so vorgeht.

    MfG,

    Probe-Nutzer



  • Probe-Nutzer schrieb:

    In beiden Fällen ist der von malloc besorgte Speicher um eine Position zu klein ausgefallen 😉 Probe-Nutzer

    da hast du recht strlen gibt ja nur die Anzahl der Buchstaben aus, ohne das abschließende '\0' Zeichen.

    Probe-Nutzer schrieb:

    THE_ONE schrieb:

    [...]verstehe aber nicht warum bei dir das EndOfString überhaupt fehlt

    Woher soll denn die abschliessende Null kommen? malloc tut das jedenfalls nicht,..

    Wenn man in C einen String angibt wird der doch immer mit '\0' abgeschlossen oder??
    Wenn man z.b. das:

    char * Wort = "Hallo"
    

    schreibt,dann ist Wort[5] = '\0'

    Lg THE_ONE

    Ps.: Der Fehler ist mir einleuchtend (stimme dir völlig zu), was mich aber wundert ist dass das Programm ohne Probleme funktioniert bei mir. An was kann das liegen?? Aus falschem Code sollte ja nicht ein korrektes Programm folgen.



  • THE_ONE schrieb:

    Wenn man z.b. das:

    char * Wort = "Hallo"
    

    schreibt,dann ist Wort[5] = '\0'

    In diesem Falle ja, aber das passiert doch gerade in eurem Programm nicht, es wird keine so "zugewiesene" Zeichenkette verwendet, sondern "roher" Speicher, der irgendetwas enthalten kann.

    THE_ONE schrieb:

    Ps.: Der Fehler ist mir einleuchtend (stimme dir völlig zu), was mich aber wundert ist dass das Programm ohne Probleme funktioniert bei mir. An was kann das liegen?? Aus falschem Code sollte ja nicht ein korrektes Programm folgen.

    Es ist nicht vorhersagbar, was passiert, wenn man solche Fehler macht, deshalb sind sie so tückisch, es kann alles gut gehen, oder abstürzen, oder sonst etwas passieren, oder es können, um das EndOfString-Problem noch hinzu zu nehmen, zufällig Nullen im von malloc besorgten Speicher liegen...

    Also kann ein Code mit solchen Fehlern, die vom Compiler unentdeckt bleiben, durchaus lauffähig sein, bis man feststellt, dass auf irgendeinem anderen System oder erst nach längerer Laufzeit Probleme auftreten.

    MfG,

    Probe-Nutzer



  • Jeden Speicher den du mit malloc reservierst solltest du am besten erstemal durch

    memset( speicher*, 0, sizeof(speicher*) );
    

    0en... dann steht überall '\0' drinn... dann solltest du auf die basis gewählter funktionen achten.. mancha geben einen int zurück, aber dann kannst ud nciht sagen

    array[strlen(array)] = '\0';
    

    sondern musst sagen

    array[strlen(array)-1] = '\0';
    

    weil dein array bei 0 losgeht aber die funktion den start 1 hat... xD



  • lippoliv schrieb:

    ...sondern musst sagen

    array[strlen(array)-1] = '\0';
    

    weil dein array bei 0 losgeht aber die funktion den start 1 hat... xD

    Hhmm...

    strlen() auf ein nicht initialisiertes Array anwenden, um damit das letzte Zeichen
    auf '\0' zu setzen ?
    Gute Nacht...



  • Probe-Nutzer schrieb:

    In diesem Falle ja, aber das passiert doch gerade in eurem Programm nicht, es wird keine so "zugewiesene" Zeichenkette verwendet, sondern "roher" Speicher, der irgendetwas enthalten kann.

    Und was ist mit

    addstring(StringArray,"Winter");
    

    Das "Winter" ist doch ein String mit abschließender '\0' oder??

    Lg THE_ONE



  • THE_ONE schrieb:

    Und was ist mit

    addstring(StringArray,"Winter");
    

    Das "Winter" ist doch ein String mit abschließender '\0' oder??

    Das ist ok, da strcpy die Null ebenfalls kopiert, und eine solche Zeichenkette immer nullterminiert ist.

    Ich habe gesehen, dass du deinen Code korrigiert hast, aber die "+1" für solution fehlt immer noch, nur so als Hinweis...

    MfG,

    Probe-Nutzer



  • @Probe-Nutzer

    Danke für deinen Hinweiß!
    Du meinst sicher folgende Zeile:

    if ((guess = (char*)malloc(strlen(solution))) == NULL) {
    

    richtig wäre

    if ((guess = (char*)malloc(1+strlen(solution))) == NULL) {
    

    Habs ausgebessert. Da sieht man wiedermal wie sich in einem kleinen Programm schon zig Fehler einschleichen können.

    Danke nochmal für deine Hilfe, THE_ONE



  • bladerunner10 schrieb:

    lippoliv schrieb:

    ...sondern musst sagen

    array[strlen(array)-1] = '\0';
    

    weil dein array bei 0 losgeht aber die funktion den start 1 hat... xD

    Hhmm...

    strlen() auf ein nicht initialisiertes Array anwenden, um damit das letzte Zeichen
    auf '\0' zu setzen ?
    Gute Nacht...

    Wieso nicht initialisiert? Ist doch jedem klar was ich meine! array ist keine Variable, sondern der Variablentyp.
    Aber wnen dus so genau haben willst

    char myArr[300] = { 0 };
    strcpy( myArr, "helloWorld" );
    myArr[strlen(myArr)-1] = '\0'; //ist überflüssig, da strcpy automatisch anhängt, aber es geht und die leute mit der Goldwage unter uns..
    

    😃


Anmelden zum Antworten