Seite 5 von 5
Verfasst: Mittwoch 9. April 2008, 21:04
von EyDu
Ich habe auch nie behauptet, dass ein Compiler dies nicht optimieren kann, man darf nur nicht davon ausgehen. Der gcc macht es zum Beispiel nicht:
Code: Alles auswählen
char* text() {
char TEXT[] = "Das ist ein Test\n";
return TEXT;
}
int main(void) { }
Code: Alles auswählen
C:\Dokumente und Einstellungen\Sebastian\Desktop\test>gcc test.c
test.c: In function `text':
test.c:3: warning: function returns address of local variable
Macht der C-Standard zu diesem Sonderfall eventuell irgendwelche Aussagen?
Verfasst: Mittwoch 9. April 2008, 22:57
von HWK
EyDu hat geschrieben:Ich habe auch nie behauptet, dass ein Compiler dies nicht optimieren kann, man darf nur nicht davon ausgehen. Der gcc macht es zum Beispiel nicht:
Code: Alles auswählen
char* text() {
char TEXT[] = "Das ist ein Test\n";
return TEXT;
}
int main(void) { }
Code: Alles auswählen
C:\Dokumente und Einstellungen\Sebastian\Desktop\test>gcc test.c
test.c: In function `text':
test.c:3: warning: function returns address of local variable
Macht der C-Standard zu diesem Sonderfall eventuell irgendwelche Aussagen?
Das verstehe ich jetzt nicht ganz. Mein Beispiel ist ja mit dem gcc von Mingw kompiliert. Man sieht dabei, dass der String in eine lokale Variable auf den Stack kopiert wird. Dies sollte ja auch so sein. Eine Optimierung liegt m.E. hier nicht unbedingt vor. Dass der String auf dem Stack liegt, führt zu folgenden Problemen:
1. Er kann immer an einer anderen Speicheradresse liegen, was BlackJack bereits sagte.
2. Er kann bei nachfolgenden Funktionsaufrufen evtl. überschrieben werden.
Kann es sein, dass Du es mit
Code: Alles auswählen
char* text() {
static char TEXT[] = "Das ist ein Test\n";
return TEXT;
}
verwechselst?
MfG
HWK
Verfasst: Mittwoch 9. April 2008, 23:05
von EyDu
Dann sind wir uns doch einig. Mir ging es um den bei dir zweiten Punkt. Ich wollte doch nur zum Ausdruck bringen, dass damit das Ergebnis von "text" zwar einen vernünftigen Pointer liefert, dieser jedoch nicht unbedingt den String "Das ist ein Test\n" repräsentiert, da dieser (String) auf dem Stack liegt und u. U. überschrieben wird.
Oder anders herum: Ich wollte nicht zum Ausdruck bringen, dass der "original" String verändert wird (wie man ja auch gut am ASM-Code sehen kann), sondern dass die Daten auf die der zurückgegebene Pointer zeigt nicht zuverlässlich sind.
EDIT: Oder als Code:
test.c
Code: Alles auswählen
char* spam() {
char spam[] = "SPAM";
return spam;
}
char* eggs() {
char eggs[] = "EGGS";
return eggs;
}
test.py:
Code: Alles auswählen
import ctypes
dll = ctypes.cdll.LoadLibrary("test.dll")
spam = dll.spam()
eggs = dll.eggs()
print ctypes.c_char_p(spam)
print ctypes.c_char_p(eggs)
Ausgabe:
Verfasst: Donnerstag 10. April 2008, 07:54
von sechsrad
Und du bist dir wirklich sicher, dass du deine Programme mit C "optimieren" willst?
es geht mir hier jetzt zur zeit nicht um die optimierung, sondern den einfachen weg mit nur einem string zurückgeben zu erweitern , einen string entgegen zunehmen , erweitern und dann zurückgeben, weil dieses erste stringbeispiel ein bisschen pipifax war.
und die theorie des zufälligen funktionieren zu zerstreuen.
soviel zufall kann nicht sein.
mfg
Verfasst: Donnerstag 10. April 2008, 08:11
von sechsrad
char* spam() {
char spam[] = "SPAM";
return spam;
}
char* eggs() {
char eggs[] = "EGGS";
return eggs;
}
nur mit return, das kann nicht gut gehen.
mfg
Verfasst: Donnerstag 10. April 2008, 09:08
von Rebecca
sechsrad hat geschrieben:und die theorie des zufälligen funktionieren zu zerstreuen.
soviel zufall kann nicht sein.
Naja, das Spassige an C ist ja, dass wenn man in einen nicht vorgesehenen, aber schreibbaren Speicherbereich schreibt, man den Fehler erst bemerkt, wenn andere Programmteile in genau in den gleichen Bereich schreiben. Deswegen ist das zufaellige Funktionieren gerade bei kleineren Programmen nicht so ganz unwahrscheinlich.
Verfasst: Donnerstag 10. April 2008, 15:49
von EyDu
sechsrad hat geschrieben:nur mit return, das kann nicht gut gehen.
Ob man die Adresse nun per return zurückgibt, oder über einen Parameter, macht keinen unterschied.
sechsrad hat geschrieben:es geht mir hier jetzt zur zeit nicht um die optimierung, sondern den einfachen weg mit nur einem string zurückgeben zu erweitern , einen string entgegen zunehmen , erweitern und dann zurückgeben, weil dieses erste stringbeispiel ein bisschen pipifax war.
Dein String-Erweiterungs-Beispiel ist aber ebenso falsch.
sechsrad hat geschrieben:und die theorie des zufälligen funktionieren zu zerstreuen.
soviel zufall kann nicht sein.
Nee, klar. Einfach ganz fest dran glauben

Verfasst: Donnerstag 10. April 2008, 16:00
von lunar
EyDu hat geschrieben:Nee, klar. Einfach ganz fest dran glauben

Ist doch ok... der Glaube versetzt ja bekanntlich Berge, da sollte so ein billiges C-Char-Array ja ein Klacks sein

Verfasst: Donnerstag 10. April 2008, 19:07
von HWK
EyDu hat geschrieben:Dann sind wir uns doch einig...
Prima!
sechsrad hat geschrieben:...nur mit return, das kann nicht gut gehen.
???
sechsrad hat geschrieben:...soviel zufall kann nicht sein.
Manchmal scheinbar doch.
MfG
HWK