Absturz!!!



  • Hallo Leute ich brauche mal wieder Hilfe!!!
    Wieso stürzt das ab???

    if (variable[strlen(variable)-1] == '$')
        halt ("strings are not DIMable", line);
    

    variable ist ein char[] mit dem Inhalt ABC$
    DANKE!!!!!!



  • mehr code



  • Würde ich gerne, aber die Forensoftware denkt ich würde Spam posten.
    Ich kann noch nicht mal einen Bruchteil der Funktion zeigen. Die Funktion hat 71 Zeilen 😞



  • Wie groß ist denn variable[]. Wieviel Speicher hast Du da allokiert?
    Mach doch vorher ein printf("%d", strlen(variable)-1), vielleicht greifst Du außerhalb der Arraygrenzen zu.

    Kann man eigentlich mit MyArray[-1] auf das Feld vor dem Array zugreifen? 😃
    Dann wäre C vollkommen *g*



  • Mike_ schrieb:

    Kann man eigentlich mit MyArray[-1] auf das Feld vor dem Array zugreifen? 😃
    Dann wäre C vollkommen *g*

    Negative Indizes sind in C möglich und manchmal sinnvoll.

    die einzige möglichkeit die mir einfällt warum das programm abstürzt ist, das du
    deinen string nicht mit \0 terminiert hast bzw. das \0 irgendwann aus versehen
    überschrieben hast, weil dann liefert dir strlen ( variable ) einen wert, der
    bestimmt größer als die richtige länge ist und dann greifst du auf einen falschen
    speicherbereich zu und dein programm stürzt ab.



  • Danke! Es war ein dummer Fehler die Variable wurde von einer anderen Funktion überschrieben. Ich habs mit dem Debugger herausgefunden.



  • Lass mich raten - du arbeitest (zu) viel mit globalen Variablen.



  • CStoll schrieb:

    Lass mich raten - du arbeitest (zu) viel mit globalen Variablen.

    Ja, lokale Variablen verlieren doch ihre Gültigkeit nach dem Verlassen einer Funktion. Das möchte ich vermeiden. Ich benutze lokale Variablen nur für temporäre Aktionen wie zum Beispiel Schleifenzähler oder temporäre Pointer. Der Fehler war übrigens nicht darauf zurückzuführen, er hätte sich bei einer lokalen Variable anders bemerkbar gemacht aber Fehler bleibt Fehler!



  • Und das Problem bei globalen Variablen ist, daß du nicht kontrollieren kannst was mit ihnen passiert. Hast du eigentlich schonmal etwas von "Parametern" und "Rückgabewerten" gehört?



  • CStoll schrieb:

    Und das Problem bei globalen Variablen ist, daß du nicht kontrollieren kannst was mit ihnen passiert. Hast du eigentlich schonmal etwas von "Parametern" und "Rückgabewerten" gehört?

    Natürlich kann man globale Variablen kontrollieren. Funktionsaufrufe mit Parameterübergabe und Rückgabewerten sind doch kein Ersatz für globale Variablen. Wie würdest du es machen, wenn du eine Variable haben willst, die ihren Zustand behalten und die von verschiedenen Funktionen eines Moduls benutzt werden soll?



  • Nein, du kannst nicht kontrollieren, in welcher der vielen Unterfunktionen eine globale Variable verwendet oder geändert wird - mit teilweise sehr weitreichenden Konsequenzen.

    Fred vom Jupiter schrieb:

    Wie würdest du es machen, wenn du eine Variable haben willst, die ihren Zustand behalten und die von verschiedenen Funktionen eines Moduls benutzt werden soll?

    Ich würde sie in der main() lokal anlegen und einen Zeiger/Referenz darauf an die Funktionen übergeben, die etwas damit machen wollen.



  • CStoll schrieb:

    Nein, du kannst nicht kontrollieren, in welcher der vielen Unterfunktionen eine globale Variable verwendet oder geändert wird - mit teilweise sehr weitreichenden Konsequenzen.

    Das verstehe ich nicht. Ich programmiere übrigens seit einem Jahr in C.

    CStoll schrieb:

    Fred vom Jupiter schrieb:

    Wie würdest du es machen, wenn du eine Variable haben willst, die ihren Zustand behalten und die von verschiedenen Funktionen eines Moduls benutzt werden soll?

    Ich würde sie in der main() lokal anlegen und einen Zeiger/Referenz darauf an die Funktionen übergeben, die etwas damit machen wollen.

    Aber wenn eine der Funktionen Fehler hat, dann würde sie die Variable auch falsch verändern. Ich sehe in dem Zusammenhang keinen Vorteil von Funktionen.



  • Fred vom Jupiter schrieb:

    CStoll schrieb:

    Nein, du kannst nicht kontrollieren, in welcher der vielen Unterfunktionen eine globale Variable verwendet oder geändert wird - mit teilweise sehr weitreichenden Konsequenzen.

    Das verstehe ich nicht. Ich programmiere übrigens seit einem Jahr in C.

    CStoll meint das wohl so, dass jeder andere code zugriff auf die variable mit 'extern' erlangen kann. mach deine globalen variablen einfach 'static', und dann isses okay (dann kannst nur du aus deinem .c-file darauf zugreifen).
    🙂



  • Das hättest du in C++ aber eleganter lösen können.



  • Mir fällt auch nix ein, wo man ne globale variable braucht, weils anders nicht geht.



  • whydoyouthinktheycallitdo schrieb:

    Mir fällt auch nix ein, wo man ne globale variable braucht, weils anders nicht geht.

    das meiste geht bestimmt ganz ohne globale variablen, wobei 'globalität' ja eher eine frage der 'extern linkage' ist. aber manchmal sind sie praktisch (lokale variablen landen auf den stack, das will man vielleicht nicht und 'static' variablen innerhalb einer funktion sind von aussen nicht sichtbar). der zugriff auf globale variablen kann übrigens wesentlich schneller sein, als über getter/setter funktionen o.ä.
    🙂


Anmelden zum Antworten