2 Stimmen

Malloc im for loop

Ich habe eine Frage... nehmen wir an, ich habe den folgenden Codeabschnitt :

int *a, *a1, *a2;
for (i=1; i<=2; i++) {
    a=malloc(sizeof(int));
    if (i==1) a1=a;
    else if (i==2) a2=a;
}
*a1=5;
*a2=4;

also meine Frage ist wenn ich printf benutze, um a1 und a2 auszugeben, wird die Variable a1 den Wert 5 und a2 den Wert 4 haben? also, wenn ich malloc benutze, um Speicherplatz zuzuweisen und a auf diesen Speicherplatz verweist und dann erneut malloc benutze, um Speicherplatz zuzuweisen, zeigt a auf einen anderen Speicherbereich, aber der erste Speicherbereich existiert immer noch? oder wenn ich malloc mit a erneut benutze, wird der erste Speicherbereich gelöscht und es wird ein neuer Speicherbereich geschrieben

10voto

Eric Postpischil Punkte 168166

Jeder Aufruf von malloc gibt einen Zeiger auf einen anderen Speicher zurück, bis Sie free aufrufen, um diesen Speicher freizugeben.

3voto

DevSolar Punkte 63096

Wenn ich printf benutze, um a1 und a2 auszudrucken, wird die Variable a1 den Wert 5 haben und a2 den Wert 4?

Ähm... nein.

a1 (vom Typ int *, d.h. Pointer zu Integer) wird die Adresse enthalten, die durch den ersten Aufruf von malloc() entsteht.

a2 (und a), die auch vom Typ Pointer sind, werden die Adresse enthalten, die durch den zweiten Aufruf von malloc() entsteht.

Die Adresse in a1 wird auf einen Integer zeigen, dem du den Wert 5 zugewiesen hast.

Die Adresse in a2 (und a) wird auf einen Integer zeigen, dem du den Wert 4 zugewiesen hast.

Beide dieser Integer bleiben allokiert, bis du sie freigibst, indem du free() mit ihrer Adresse aufrufst. Vorsicht: Nachdem du z.B. free( a2 ) aufgerufen hast, ist der Integer nicht mehr allokiert. Wenn du free() erneut auf derselben Adresse aufrufst (z.B. über free( a ) oder durch Aufrufen von free( a2 ) ein zweites Mal), wird ein undefiniertes Verhalten auftreten (d.h., wenn du Glück hast, wird dein Programm abstürzen).

Ein Pointer ist ein Adresswert. Es scheint, dass hier deine Verwirrung herkommt: Es ist nicht identisch mit dem Ding, auf das es zeigt.

0voto

RageD Punkte 6513

Ich glaube, die Antwort auf deine Frage ist ja. Das Mallocen gibt dir eine Speicheradresse mit (mindestens) der angegebenen Größe (falls verfügbar). Es gibt keinen Speicher frei, sondern gibt dir mehr (verwende free(), um Malloc-Speicher freizugeben).

Die Tatsache, dass du eine temporäre Variable a verwendest, hat keine Bedeutung. Am Ende dieser Schleife gilt a == a2 != a1

0voto

Wenn ich printf verwende, um a1 und a2 auszudrucken, hat die Variable a1 den Wert 5 und die a2 den Wert 4?

Ja, das ist korrekt. Es ist jedoch eine etwas seltsame Frage, da es einfacher ist, es auszuprobieren, als zu fragen.

Also, wenn ich malloc verwende, um Speicher zuzuweisen und a auf diesen Speicherplatz zeigt und dann erneut malloc verwende, um Speicher zuzuweisen, zeigt a dann auf einen anderen Speicherbereich, aber der erste Teil des Speichers existiert immer noch?

Das ist korrekt. malloc() alloziert Speicher, der "existiert", bis Sie ihn mit free() freigeben oder einen realloc() durchführen, der Ihre Daten möglicherweise in einen anderen Speicher verschiebt und den alten Speicherplatz freigibt. Ich empfehle Ihnen, einige Dokumentationen dazu zu lesen. Zumindest die Man-Seite.

Ihr Code enthält auch Fehler. Sie verwenden eine Zuweisung anstelle eines Vergleichs und die Variable i ist nicht definiert. Hier ist eine korrigierte Version mit einem printf():

#include 
#include 

int main()
{
    int *a,*a1,*a2;
    int i;

    for (i=1; i<=2; i++) {
        a = malloc(sizeof(int));
        if (i==1)
            a1 = a;
        else if (i==2)
            a2 = a;
    }
    *a1=5;
    *a2=4;

    printf("a1=%d, a2=%d\n", *a1, *a2);

    free(a1);
    free(a2);

    return EXIT_SUCCESS;
}

Hoffentlich hilft es. Viel Glück!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X