EyDu hat geschrieben:BlackJack hat geschrieben:@EyDu: Die Zeichenkette sollte sich nicht auf dem Stack befinden. Das würde ja bedeuten, dass die Zeichenkette bei jedem Aufruf von woanders dort hin kopiert werden müsste, und da literale Zeichenketten "read only" sind, wäre das ziemlich unsinnig.
Das mag ja durchaus sein, dass eine Compiler in diesem Fall optimiert, aber im allgemeinen Fall kann man nicht davon ausgehen:
Code: Alles auswählen
void text(int* r) {
char text[] = "hurra, es geht !\n";
text[4] = **a random character**;
*r=text;
}
BlackJack hat schon recht, wie man hier am Assemblercode von
Code: Alles auswählen
char* text() {
char TEXT[] = "Das ist ein Test\n";
return TEXT;
}
in Mingw sieht:
Code: Alles auswählen
6ABC11AC ASCII "Das ist ein Test\n",0
6ABC11BE PUSH EBP
6ABC11BF MOV EBP,ESP
6ABC11C1 SUB ESP,28
6ABC11C4 MOV EAX,DWORD PTR DS:[6ABC11AC]
6ABC11C9 MOV DWORD PTR SS:[EBP-28],EAX
6ABC11CC MOV EAX,DWORD PTR DS:[6ABC11B0]
6ABC11D1 MOV DWORD PTR SS:[EBP-24],EAX
6ABC11D4 MOV EAX,DWORD PTR DS:[6ABC11B4]
6ABC11D9 MOV DWORD PTR SS:[EBP-20],EAX
6ABC11DC MOV EAX,DWORD PTR DS:[6ABC11B8]
6ABC11E1 MOV DWORD PTR SS:[EBP-1C],EAX
6ABC11E4 MOV AX,WORD PTR DS:[6ABC11BC]
6ABC11EA MOV WORD PTR SS:[EBP-18],AX
6ABC11EE LEA EAX,DWORD PTR SS:[EBP-28]
6ABC11F1 LEAVE
6ABC11F2 RETN
Das ist meines Erachtens gängiges Verhalten von C-Compilern. D.h. der Code wird aus dem Code-Segment immer in einen evtl. unterschiedlichen Bereich des Stacks kopiert. Probleme gibt es v.a. dann, wenn neue Funktionen aufgerufen werden. Diese können nämlich diesen Stackbereich überschreiben. Nicht umsonst warnt deshalb der C-Compiler, dass hier die Adresse einer lokalen Variable übergeben wird.
MfG
HWK