0

Can u erklären, wie die Erinnerung an dem so große Zeichenfolge selbst halten wird unten zugewiesen, obwohl eine Größe von malloc sind gibt nur ein Bytedynamische Speicherzuweisung für Doppelzeiger nimmt die Größe als eine, aber kann eine Zeichenfolge mehr als ein Byte enthalten.wie ist das möglich?

sind ziemlich verwirrt zu sein, wie es funktioniert.

+0

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. –

+0

Warum denkst du, dass 'malloc()' "nur ein Byte" zuweist? – babon

+0

"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). –

Antwort

3

Sie ordnen kein Byte zu. Der Ausdruck sizeof(char*)*len kann auf sizeof (char *), d. H. Die Größe eines Zeichenzeigers, vereinfacht werden. Dies ist in der Regel 4 oder 8.

Dann speichern Sie nur einen einzigen Zeiger gibt, wird der Wert des Stringliteral "This is a string" ist die Adresse, dass die wörtliche erscheint im Speicher, so dass dies:

str[0] = "This is a string"; 

gerade tut ein einzelne Zeiger-große Zuordnung zu str[0] (die ein Zeiger ist), werden keine Charaktere kopiert. Genau ein Zeiger gibt an, wie viel Platz Sie zugewiesen haben, also funktioniert alles gut.

0

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.";