Pointer mit Array-Notation
-
Beispielprogramm zu meiner Frage:
#include <stdio.h> int main(void) { char str1[] = "abcd"; // flutscht char *str2 = "efgh"; // flutscht str1[0] = 'x'; // flutscht str2[0] = 'y'; // verursacht segmentation fault }
Zeiger und Felder sind ja so 'ne Sache in C. Ich gebe mir Mühe, das halbwegs zu begreifen. Dass Zeiger und Felder nicht das selbe sind, weiß ich. Aber offensichtlich kann ich die Notation mit den eckigen Klammern auch bei Zeigern verwenden. Wenn ich's richtig verstehe, zeigt Zeiger[Index] von der Adresse des Zeigers aus entsprechend seines Datentyps sizeof(Datentyp)*Index Bytes weiter.
Frage: Warum kann ich da nicht einfach reinschreiben? Weiß das jemand und kann es mir verständlich machen?
Der Compiler sagt ja nix dazu.
-
Weil der Zeiger quasi const wird
Du darfst also das worauf der Zeiger zeigt nicht verändern.Edit:
Wär aber eigentlich mal schön, wenn der Compiler da warnen würde..Zur Verdeutlichung, das wäre äquivalent:
#include <stdio.h> int main(void) { char str1[] = "abcd"; // flutscht const char *str2 = "efgh"; // flutscht str1[0] = 'x'; // flutscht str2[0] = 'y'; // verursacht segmentation fault }
-
str2 verweist auf den String "efgh".
Der kann auch in einem Speicherbereich abgelegt sein, den du nicht beschreiben darfst. -> Segfault.
-
Und str1 ist ein neues Feld, in das der Inhalt {'a', 'b', 'c', 'd', '\0'} hineinkopiert wird.
-
cooky451 schrieb:
Weil der Zeiger quasi const wird
Du darfst also das worauf der Zeiger zeigt nicht verändern.Edit:
Wär aber eigentlich mal schön, wenn der Compiler da warnen würde..Zur Verdeutlichung, das wäre äquivalent:
#include <stdio.h> int main(void) { char str1[] = "abcd"; // flutscht const char *str2 = "efgh"; // flutscht str1[0] = 'x'; // flutscht str2[0] = 'y'; // verursacht segmentation fault }
Das ist IMHO nicht äquivalent. Ein konstanter Zeiger ist etwas anderes, als ein Zeiger, der auf ein konstantes Literal zeigt. Deshalb ist DirkBs Begründung die richtige.
Edit: Ein verwandtes Thema wird auch gerade in diesem Thread heiß diskutiert.
-
scimansix schrieb:
Das ist IMHO nicht äquivalent.
Die Aussage würde ich mir noch mal überlegen
const char *str1; const char *str2 = "hallo!\n"; str1 = str2; printf("%s", str1);
Oh Wunder! Es kompiliert ohne Warnung
Und hier gibt's auf einmal eine Warnung:
const char *str1; char str2[] = "hallo!\n"; str1 = str2; str1[0] = 'f';
Komische Welt..
-
Tatsache! Dann nehme ich alles zurück und Schande über mein Haupt
Rein intuitiv wäre ich aber davon ausgegangen, dass man mit
const char *str;
einen konstanten Zeiger deklariert. Schließlich ist
const int a;
ja auch eine konstante Ganzzahl. Aber einen konstanten Zeiger bekommt man wohl wirklich nur so:
char * const str;
Das liegt wohl daran, dass im oberen Fall lediglich der Typ selbst als konstant deklariert wird.