Anzeige:
Ergebnis 1 bis 11 von 11

Thema: C-Verständnisproblem

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194

    C-Verständnisproblem

    Hi!

    Also habe vor kurzen diesen Code-Teil gesehen! Kann wer mir den mal erklären?
    Code:
    void foobar(float p1[3]) {
    
    	p1[0]= 1.0f;
    	p1[1]= 2.0f;
    	p1[2]= 3.0f;
    
    }
    
    int main (int argc, char **argv) {
    
    	float p[2];
    
    	foobar(p);
    
    	return 0;
    
    }
    Warum ergibt das hier keinen Seg-Fault? Oder was passiert hier eigentlich genau?

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ich habs mir angeschaut und gefunden, es müsse irgendwas reklamieren.

    Dann hab ich mir den Code mit dem Borland Compiler compiled (4.5 - in der Schule hamma fast nur Windows) - und er sagt: "Abnormal program termination" - natürlich nicht der BCC sondern das Programm zur Laufzeit.

    Also alles so wies sein sollte, bei mir.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    hmm, ja, aber was passiert bei diesem Code genau, wenn ich zb für p mit einer Größe von 3 Arrayelementen initiliasiere?!?

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Also ich habs jetzt noch mal mit gcc getestet. Und der sagt nix.

    Wenn du das mit 3 Elementen initialisierst, sollte das i.o. sein - d.h. kein Fehler. Aber so mit zwei sollte das einen Segfault geben. Es müsste sogar.
    Mit BCC tut es auch, aber mit gcc/g++ nicht.

    Ich bitte auch um Erleuchtung.

    Wo hast du den Code her?

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Du greifst auf ein Element zu,das nicht existiert,damit erzeugst du undefiniertes Verhalten.
    Und wie das Wort schon sagt 'undefiniert',kann alles passieren.
    Man freut sich natürlich,wenn es einen Seg-Fault gibt,und man den Fehler im Code berichtigen kann.
    Aber es gibt kein Verhalten,das man erwarten kann.

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    ok, das Programm muss sich also nicht beklagen.

    Was macht es dann? Kann man das irgendwie rausfinden?

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  7. #7
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Also das Programm schreibt in die Adresse p1 + 2 den wert 1.0f rein. IN diesen Fall ist aber diese Adresse keine dafür vorgesehene Variable. Was es ist, ist so nicht feststellbar. Jedenfallls ist es wohl nicht weit genug entfernt, um in einen von dem OS geschützten Speicherbereich zu reichen. Also in z.B. einen read only Bereich, in dem Programmcode steht oder die Adresse 0. Denn wenn es dies tun würde, würde das erkannt und mit einen seg.fault gemeldet werden.
    Unter umständen änderst du mit diesen (falschen) Programmcode eine andere Variable von dir. Es kann aber sein das auch nie etwas fehlerhaftes passiert, die meisten compiler (od. macht das, dass OS?) runden allozierten Speicher auf "runde" Werte auf (also ich denk 4, 8, 16, 32, ....).
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  8. #8
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    ne andere Variable wird es hier wohl kaum sein. Denn es gibt ja nix anderes.

    Ausser argc und argv - die sollte man wohl mal überprüfen.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  9. #9
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Naja, es gibt z.B. die environmen Variablen.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  10. #10
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    naja, das Programm könnte in diesem Fall auch Funktionsadressen, return-Adressen, etc. überschreiben.

    Zum Code selber: das "float p1[3]" im
    Code:
     void foobar(float p1[3])
    ist eigentlich nur wichtig, damit man weiss (oder andere wissen), wie groß man sein übergegebenes Array dimensionieren soll, oder?

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  11. #11
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von Silver

    Zum Code selber: das "float p1[3]" im
    Code:
     void foobar(float p1[3])
    ist eigentlich nur wichtig, damit man weiss (oder andere wissen), wie groß man sein übergegebenes Array dimensionieren soll, oder?
    Ja,mehr als eine Kommentarfunktion hat es nicht.
    Ansonsten sind alle folgenden Varianten äquivalent:
    Code:
    void foo(float *f);
    void foo(float f[100]);
    void foo(float f[]);

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •