Wenn Sie darüber nachdenken, „a string“ in C, sollten Sie es als ein Array von char
‚s sehen .
0 1 2 3 4 5 9
+---+---+---+---+---+---+-- --+---+
s -> | p | i | p | p | o | \0| ... | |
+---+---+---+---+---+---+-- --+---+
ist, was
char s[10] = "pippo";
schaffen würde:
mir die Kennung s
statt userInput
der Kürze halber verwenden lassen.
Mit anderen Worten, es ist ein Speicherblock, in dem die ersten 6 Bytes wie gezeigt initialisiert wurden. Es gibt keine s
Variable überall.
Stattdessen erklärt ein char *
wie in
char *s;
würde eine Variable erstellen, die einen Zeiger auf char
halten kann:
+------------+
s| 0xCF024408 | <-- represent an address
+------------+
Wenn Sie so denken, fällt sofort das zu tun:
scanf("%s",s);
machen nur Sinn in der fi ersten Fall, wo es (hoffentlich) genug Speicher gibt, um die Zeichenfolge zu halten.
Im zweiten Fall zeigt die Variable s
auf eine zufällige Adresse und Sie schreiben etwas in einen unbekannten Speicherbereich.
Für Vollständigkeit, in Fällen wie:
char *s = "pippo";
haben Sie die folgende Situation in Erinnerung:
0 1 2 3 4 5
+---+---+---+---+---+---+ Somewhere in the
0x0B320080 | p | i | p | p | o | \0| <-- readonly portion
+---+---+---+---+---+---+ of memory
+------------+ a variable pointing
s| 0x0B320080 | <-- to the address where
+------------+ the string is
Sie können s
woanders machen zeigen, aber sie können nicht den Inhalt der Änderung String zeigt von s
.
'char * userInput;' -> 'char userInput [16];' – BLUEPIXY
'scanf' in einen nicht gesetzten Zeiger? Wer hat dir vorgeschlagen, das zu tun? – John3136