Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : C-Verständnisproblem



Silver
05-01-2004, 12:33
Hi!

Also habe vor kurzen diesen Code-Teil gesehen! Kann wer mir den mal erklären?


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

peschmae
05-01-2004, 14:26
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ä

Silver
05-01-2004, 20:54
hmm, ja, aber was passiert bei diesem Code genau, wenn ich zb für p mit einer Größe von 3 Arrayelementen initiliasiere?!?

mfG

peschmae
05-01-2004, 21:07
Also ich habs jetzt noch mal mit gcc getestet. Und der sagt nix. :eek::eek:

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. :D

Wo hast du den Code her?

MfG Peschmä

wraith
05-01-2004, 21:34
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.

peschmae
06-01-2004, 08:24
ok, das Programm muss sich also nicht beklagen.

Was macht es dann? Kann man das irgendwie rausfinden?

MfG Peschmä

panzi
06-01-2004, 13:40
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, ....).

peschmae
06-01-2004, 14:03
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ä

panzi
11-01-2004, 13:28
Naja, es gibt z.B. die environmen Variablen.

Silver
11-01-2004, 15:01
naja, das Programm könnte in diesem Fall auch Funktionsadressen, return-Adressen, etc. überschreiben.

Zum Code selber: das "float p1[3]" im
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

wraith
11-01-2004, 15:08
Original geschrieben von Silver

Zum Code selber: das "float p1[3]" im
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:


void foo(float *f);
void foo(float f[100]);
void foo(float f[]);