[C] Unsigned int Wert eines Strings

mc_gulasch

Erfahrenes Mitglied
Hallo zuammen,

wenn man sich den unsigned int Wert eines Zeichens c ausgeben lässt, erhält man seinen ASCII - Wert, klar, aber was passiert, wenn man sich den Wert eines Strings 'AAA' ausgeben lässt? Woher kommt diese Zahl und noch viel wichtiger: Ist diese Zahl eindeutig, so dass kein anderer String den gleichen Wert wie mein 'AAA' hat (befürchte fast, das ist unwahrscheinlich :rolleyes: )? Kennt sich da wer aus?

Danke sagt das Gulasch
 
Hi.

Ein String in C ist nichts weiter als ein Array von Zeichen. Und eine Array-Variable - genau wie eben eine String Variable auch - ist nichts anderes als ein Zeiger.

Nun gibt es einen Unterschied zwischen dem Zeigerwert und dem Wert auf den dieser Zeiger zeigt. Wenn du 2 Strings hast und du vergleichst diese mit dem == Operator dann vergleichst du nur die Adressen auf die diese Zeiger zeigen und nur wenn beide auf die gleiche Adresse zeigen kommt bei dem Vergleich auch "wahr" heraus - ganz unabhängig vom Inhalt.

Strings muß man daher mit einer der strcmp/strcasecmp/strncmp/strncasecmp Funktionen vergleichen.
C:
char* str1 = "hallo";
char* str2 = "hallo";
char* str3 = str2;

if (str1 == str2) /* ist falsch */

if (str2 == str3) /* ist wahr, denn beide zeigen auf die gleiche Adresse */

if (strcmp (str1, str2) == 0) /* ist wahr, beide besitzen den gleichen Inhalt */

Der Wert eines Strings in einen unsigned int gecastet ist eben die Adresse an der der Wert des Strings steht, gecastet in einen unsigned int.

Gruß

/edit: Ich hab den ersten Test mal selbst ausprobiert und es ist so, das der Compiler bei konstanten Strings dann natürlich optimiert und nur eine Kopie ins Datensegment legt so das tatsächlich beide Strings auf die gleiche Adresse verweisen. Normalerweise kann man aber davon ausgehen, das 2 Stringvariable nicht == sind.
 
Zuletzt bearbeitet:
Hallo,

was du als Wert eines String Literales beschreibst ist in Wirklichkeit die Adresse auf den String im Textsegment.
Der Compiler legt afaik Stringliterale im Textsegment ab. Das hat folgende Konsequenz:
C:
#include <stdio.h>

int main(){
    int address1 = (int)"Hello";
    int address2 = (int)"World";
    printf("%d\n", address1);
    printf("%d\n", address2);
}

Die Adresse von "Hello" und "World" sind unterschiedlich da der Compiler ja zweimal Platz im Textsegment fuer die 2 unterschiedlichen Woerter anlegen muss. Im Normalfall sollte die Differenz zwischen address1 und
address2 also 6 byte sein...

C:
#include <stdio.h>

int main(){
    int address1 = (int)"Hello";
    int address2 = (int)"Hello";
    printf("%d\n", address1);
    printf("%d\n", address2);
}

Hier sollten die 2 Adressen die gleichen sein, da der Compiler optimieren kann und das Wort "Hello" nur einmal
im Textsegment ablegt...

Aber nochmal konkret auf deine Frage zurueckzukommen:
Der Adresswert eines Stringliterals sagt absolut gar nichts ueber den Inhalt dessen aus...
Indirekt schon wegen der Optimierungssache, aber das kann voll und ganz vom Compiler abhaengen...

Gruß,

RedWing
 
RedWing hat gesagt.:
Hier sollten die 2 Adressen die gleichen sein, da der Compiler optimieren kann und das Wort "Hello" nur einmal
im Textsegment ablegt...
Ja, hab ich auch grad gemerkt. Ich bin mir aber nicht sicher ob das nicht ein Spezialfall ist, da es (wenn ich mich recht erinnere) auch Rechnerarchitekturen gibt wo es keine besondere Unterteilung in Daten/Textsegment und Codesegment gibt. Da wäre es dann vermutlich nicht sinnvoll einfach beide Zeiger auf die gleiche Adresse zu setzen weil man den Wert einer Variablen ändern können sollte.

Gruß

/edit: Bei GCC gibt's dafür übrigens die Option -fwritable-strings die dafür sorgt, das Stringkonstanten im beschreibbaren Datensegment abgelegt werden und nicht "unifiziert" werden. Die Option ist allerdings veraltet.
 
Zuletzt bearbeitet:
Hallo,
(wenn ich mich recht erinnere) auch Rechnerarchitekturen gibt wo es keine besondere Unterteilung in Daten/Textsegment und Codesegment gibt.

Ja da hast du recht, ich denke das haengt davon ab ob die MMU der jeweiligen
Architektur in Ihren Pagedeskriptoren auch Flags fuer Speicherschutz etc besitzt.
Wenn das der Fall ist, kann das ein BS dann auch nutzen...

Ich denke (korrigier mich bitte falls ich falsch liegen sollte) der Vergleich
von Stringkonstanten bzw -literalen ist im C Standard eh nicht definiert.
Der Compiler- bzw. Architekturaspekt waeren dann sicherlich eine der Gruende
dafuer...

/edit: Bei GCC gibt's dafür übrigens die Option -fwritable-strings die dafür sorgt, das Stringkonstanten im beschreibbaren Datensegment abgelegt werden und nicht "unifiziert" werden. Die Option ist allerdings veraltet.
Ah gut zu wissen :)

Gruß,

RedWing
 
Zurück