it-swarm.com.de

Weisen Sie Speicher zu und speichern Sie den String in c

Ich habe mich gefragt, warum der folgende Code nicht funktioniert

int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     test = "testingonly";
     free(test);
}

Nachdem ich darüber nachgedacht hatte, war ich davon ausgegangen, dass ich zunächst 12 Zeichen im Speicher zuweise, aber die Zuweisung in der nächsten Zeile erstellt ein Zeichenarray auf dem Stapel und die Speicheradresse wird zum Test übergeben. Free () versucht also, Speicherplatz freizugeben, der nicht zulässig ist. Ist das korrekt?

Was wäre also der richtige Ansatz, um eine Zeichenfolge auf dem Heap zu speichern? Ist der folgende Weg ein üblicher Weg?

int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     strcpy(test, "testingonly");
     free(test);
}
20
pluckyDuck
char *test = (char*) malloc(12*sizeof(char));

        +-+-+-+-+-+-+-+-+-+-+-+-+
test--->|x|x|x|x|x|x|x|x|x|x|x|x|   (uninitialized memory, heap)
        +-+-+-+-+-+-+-+-+-+-+-+-+

test = "testingonly";

        +-+-+-+-+-+-+-+-+-+-+-+-+
test +  |x|x|x|x|x|x|x|x|x|x|x|x|
     |  +-+-+-+-+-+-+-+-+-+-+-+-+
     |  +-+-+-+-+-+-+-+-+-+-+-+-+
     +->|t|e|s|t|i|n|g|o|n|l|y|0|  
        +-+-+-+-+-+-+-+-+-+-+-+-+

free(test); // error, because test is no longer pointing to allocated space.

Anstatt den Zeiger test zu ändern, müssen Sie die Zeichenfolge "testingonly" in die zugewiesene Stelle kopieren, z. strcpy oder verwenden Sie strdup. Beachten Sie, dass Funktionen wie malloc und strdupNULL zurückgeben, wenn nicht genügend Speicher verfügbar ist und daher geprüft werden sollte.

char *test = (char*) malloc(12*sizeof(char));
strcpy(test, "testingonly");

        +-+-+-+-+-+-+-+-+-+-+-+-+
test--->|t|e|s|t|i|n|g|o|n|l|y|0|
        +-+-+-+-+-+-+-+-+-+-+-+-+

oder

char *test = strdup("testingonly");

        +-+-+-+-+-+-+-+-+-+-+-+-+
test--->|t|e|s|t|i|n|g|o|n|l|y|0|
        +-+-+-+-+-+-+-+-+-+-+-+-+
61
Anders

Sie haben Ihre Frage bereits beantwortet. Im Wesentlichen ist strcpy die geeignete Methode zum Kopieren von Zeichenfolgen.

8
dicaprio

Die erste Version erstellt keine Zeichenfolge auf dem Stack. Sie haben jedoch die Möglichkeit, dass Sie nach der Zuweisung keine free-Zeichenfolge haben dürfen. String-Literale werden normalerweise in konstanten/schreibgeschützten Speicherbereichen gespeichert. Die Zuweisung kopiert nichts, nur test zeigt auf diesen Speicherbereich. Du kannst es nicht befreien. Sie können diese Zeichenfolge auch nicht ändern.

Ihr zweiter Code ist korrekt und üblich. Vielleicht möchten Sie auch in strdup nachsehen, ob Ihre Implementierung dies hat.

5
Mat

Nun, du hast recht. Lassen Sie uns nun den ersten Code untersuchen.

char *test = (char*) malloc(12*sizeof(char));

Der obige Code ist kein Problem.

test = "testingonly";

Hier haben Sie den Zeiger test geändert, der zu einem Speicherverlust führt. Und wenn Sie versuchen zu befreien, geben Sie nicht den tatsächlich zugewiesenen Zeiger frei, sondern ein "testingonly" -Literal, auf das verwiesen wird. Literal weist auf einen konstanten Speicher hin, der in gewöhnlichen Szenarien nicht überschrieben werden kann.

Nun zum zweiten Teil des Codes. Dies funktioniert gut, wenn Sie explizit Daten von dem Ort, an dem sich das Literal auf den Heap befindet, auf den Ihre test zeigt, kopiert haben.

Zu Ihrem zweiten Punkt ist ja strcpy ein üblicher Weg. Andere Möglichkeiten sind "memcpy", wenn Sie rohe Bytes kopieren.

HINWEIS: Literale werden nicht im Stapel gespeichert. Sie können den Speicherort der Literale jedoch nicht ändern.

4
havexz

der Code

#include <stdio.h>
int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     strcpy(test, "testingonly");
     printf("string is: %s\n",test);
     free(test);
     return 0;
}

wird funktionieren 

0
Anes

Dies ist für die Zuordnung des Speichers:

char *string;
string = (char *) malloc(15);

Dies ist zum Speichern der Daten:

strcpy(str, "kavitajain");
printf("String = %s,  Address = %u\n", str, str);
0
Kavita Jain