URL: https://www.overclockers.at/coding-stuff/c_laenge_eines_strings_an_einem_char_pointer_99683/page_2 - zur Vollversion wechseln!
wenn du den ASM code herzeigst, mach bitte ein Foto von der "Tussn"
wtf?! sagt was..Code:char* s1 = "wasweisich"
Zitat von RingdingVon dir oder abgeschrieben?
Schaut irgendwie aus, als käme es aus der MS CRT.
Zitat von matwtf?! sagt was..Code:char* s1 = "wasweisich"
würde schon genügen, wenn ein statisches char-array ausreicht.Code:char s1[] = "wasweisich\0"
Funktioniert natürlich nur, wenn sie auf Intel Maschinen arbeiten und ist daher nicht wirklich empfehlenswertZitatrichtig erkannt, ist aus dem strlen.asm von vs6
@mat & FMFlash:
Wo soll das Problem sein? Das ist eine absolut korrekte Schreibweise.
Zitat von RingdingFunktioniert natürlich nur, wenn sie auf Intel Maschinen arbeiten und ist daher nicht wirklich empfehlenswert
Aber es ist wenigstens nicht Windows-abhängig.
Nur wenn du's so in Assembler schreibst, dann kannst es gleich in C schreiben. Genau das wird der Compiler nämlich ausspucken. Die gepostete Version ist doch recht gut geschwindigkeitsoptimiert, weil sie pro Iteration gleich 4 Bytes überprüft.
wann hat sich das eingeschlichen? is ja furchtbar.. ich mein, es ist einfach inkonsistent. weil logischerweise weise ich so einem pointer eine adresse zu, ned den inhalt. na ja, c++ halt. ich bin da eher der oldschooltyp. ich liebe zwar oop, aber ich hasse string sowie cin und cout und etliche andere fehlgeburten
Zitat von Ringding@mat & FMFlash:
Wo soll das Problem sein? Das ist eine absolut korrekte Schreibweise.
Der \0 Terminator wird automatisch erzeugt, wenn du doppelte Anführungszeichen verwendest.
@mat: Es wird ja eh die Adresse zugewiesen, nämlich die Adresse vom statisch allokierten String.
das is IMO auch das problem! wenn ich einen kleinen lokalen buffer brauche dann verwende ich char szBuffer[255], wenn ich einen globale string brauche, dann nehm ich einen char *. die char* szFoo = "arg" methode ist extrem fehleranfällig, weil folgendes einen fehler ergibt:
sicher is das idiotisch, aber das wäre ein typischer einsteigerfehler bzw. auch eine umsteigerfalle. zB in php wär das vollkommen korrekt.Code:void foo(char *szBla) { szBla = "idiot"; } main: char *szBla = "cool"; foo(szBla);
Code:void foo(char **szBla) { *szBla = "idiot"; }
Strings werden immer statisch alloziert.
Richtig, das geht. Sollte es auch.
aber denk mal nach: eigentlich ist das ned die beste methode. bei jedem string der so zugewiesen wird, erstellt der compiler einen statisch, globalen bereich. ich würde eher auf lokal plädieren, weil wenn ich einen globalen adressbereich haben will, dann sollte ich selber einen allozieren müssen, und zwar mit bedacht.
is nur so ein kleiner gedanke
Magst jetzt das 30 Jahre alte C umkrempeln?
Ich versteh außerdem nicht ganz, was du meinst.
Die eine Möglichkeit, "lokal" zu verstehen, heißt, dass es einfach im Object File keinen Namen kriegt, also das, was mit static Funktionen und Variablen passiert. Die liegen auch "global" im Datensegment, sind aber namenlos, daher von außen nicht zugreifbar (außer man reicht einen Pointer raus).
Die andere Möglichkeit wäre, dass man es als "am Stack liegend" auffasst. Das ist aber ziemlich sinnlos. Wie soll es denn dort hinkommen? Es müsste bei jedem Eintritt in die Funktion auf den Stack kopiert werden. Und damit's überhaupt kopiert werden kann, muss es erst recht wieder im Datensegment herumliegen. Also ein lose-lose
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025