Sie ordnen nicht zu, was Sie denken, dass Sie zuweisen.
Wenn Sie sagen,
char **str;
dies ist nicht eine Variable, die einen String halten kann. Dies ist eine Variable, die ein Array mehrerer Strings enthalten kann.
Wenn Sie sagen,
int len = 1;
str = malloc(sizeof(char*) * len);
Sie str
einrichten, eine Saite zu halten. Das heißt, in diesem Fall zählt len
die Anzahl der Zeichenfolgen, nicht die Länge der Zeichenfolge.
Dann, wenn Sie sagen
str[0] = "This is a string";
Sie mit einem Zeiger auf die String-Konstante in str
‚s eine Zeichenfolge füllen. Der Compiler hat Speicher für die String-Konstante für Sie reserviert, so dass Sie nicht müssen. In diesem Fall kopieren Sie nur den Mauszeiger. Sie kopieren nicht die gesamte Zeichenfolge, sodass Sie nicht mehr Speicher dafür reservieren müssen. Es ist ähnlich wie wenn Sie gerade gesagt haben
char *p;
p = "This is a string";
Wenn Sie Speicher für die gesamte Zeichenfolge zuweisen wollen, und kopieren Sie tatsächlich die gesamte Zeichenfolge, es könnte wie folgt aussehen:
const char *string_to_copy = "This is a string";
str[0] = malloc(strlen(string_to_copy) + 1); /* +1 for \0 */
if(str[0] == NULL) exit(1);
strcpy(str[0], string_to_copy);
Und wenn man wollte Verwenden Sie str
, um mehrere Zeichenfolgen zu halten, könnte es wie folgt aussehen:
len = 4;
str = malloc(sizeof(char*) * len);
if(str == NULL) exit(1);
str[0] = "This";
str[1] = "is";
str[2] = "a";
str[3] = "test.";
Sie nicht 1 Byte zuordnen. Sie weisen einen Zeiger zu - wahrscheinlich 4 oder 8 Bytes. Dann weisen Sie es einer const-Zeichenfolge zu, die bereits an anderer Stelle existiert. –
Warum denkst du, dass 'malloc()' "nur ein Byte" zuweist? – babon
"Warum funktioniert dieses offensichtlich ungültige Programm?" Im Allgemeinen ist diese Art von Frage nicht produktiv. Lesen Sie "undefiniertes Verhalten". (Dieses Programm ist möglicherweise ungültig oder nicht). –