Speicher mit malloc wird nicht bleiben außerhalb Funktionsumfang?
Hallo,
Ich bin ein bisschen neu in C-s malloc-Funktion, sondern von dem, was ich weiß, sollte es speichern den Wert in den heap, so dass Sie verweisen können es mit einem Zeiger aus, die außerhalb des ursprünglichen Umfang. Erstellt habe ich ein test-Programm, das ist, dies zu tun, aber ich erhalte immer den Wert 0, nach dem ausführen des Programms. Was mache ich falsch?
int f1(int * b) {
b = malloc(sizeof(int));
*b = 5;
}
int main() {
int * a;
f1(a);
printf("%d\n", a);
return 0;
}
InformationsquelleAutor der Frage PM. | 2010-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja!
a
ist durch Wert übergeben so dass der Zeigerb
in Funktionf1
werden lokale..entweder zurück
b
,oder pass
a
's AdresseInformationsquelleAutor der Antwort raj
Es sieht aus wie du bist Missverständnis ein wesentlicher Teil, wie C funktioniert - nämlich, dass es ein "pass-by-value' - Sprache. Um für
main()
wissen über den Speicher, den Sie vergeben, müssen Sie es wieder aus. Der folgende code machen, was man will:Gibt es ein paar Unterschiede zwischen diesem code und Ihre; ersten, die Signatur von
f1()
geändert hat, so dass es zurückgeben kann, das Ergebnis dermalloc()
Anruf in die übergebene Zeiger. Als Nächstes erfolgt der Aufruf zuf1()
geändert wurde, übergeben Sie die Adresse vona
eher alsa
selbst - wichtig, wenn Sie wollen, dass es "gefüllt", indemf1()
so zu sprechen. Endlich, dieprintf()
immain()
wurde geändert, um Druck aus dem Spitzen-Wert eher als der Zeiger selbst.InformationsquelleAutor der Antwort Carl Norum
Den Speicher selbst besteht, aber es Lecks, weil Sie nicht die Bereitstellung der zugewiesenen Zeiger auf den Anrufer. Auch, Sie drucken
a
wenn Sie sollten Druck*a
. Schließlich bist du nicht wieder einen int ausf1
.Versuchen:
InformationsquelleAutor der Antwort Matthew Flaschen
Lässt annehmen, dass Sie einen Wert zuweisen, der
NULL
ein, bevor Sie die Funktion aufrufenf1
. Jetzt ist der Weg f1 definiert ist, dauert es seine argument(Zeiger auf einint
) von Wert. Das istb
wird eine weitere variable vom Typint *
wird kopieren vona
. Sob
auch einen Wert haben wird, derNULL
. Jetzt inf1
Sie den Wert ändern, indemb
durch zuweisen der Adresse des Speichers, der dynamisch mitmalloc
. Können sagen, dass die Speicher-Adresse ist0x123
. Als Ergebnis dieser Zuordnungb
geändert hat, seinen Wert ausNULL
zu0x123
abera
(inmain
) weiterhin zu haltenNULL
da sich b nicht änderna
wie Sie sind zwei getrennte Variablen. Als Ergebnis dieser, wenn Sie zurückkehren aus der Funktionf1
eines wird unverändert bleiben.Gibt es 2 Wege, diese zu lösen. Sie können die Funktion
f1
Gegenzug den Wert des geändertenb
und dann weisen Sie es zurück zu einem inmain
und zwei, die Sie übergeben können, die eine von-Adresse, so dass änderungen inf1
auf eine inmain
zu..
InformationsquelleAutor der Antwort codaddict
Die Adresse
int *b
wird gelöscht, wenn die Funktion zurückkehrt. Um es zu retten, Sie verwenden müssen, um einen Zeiger an einen ZeigerInformationsquelleAutor der Antwort Phong
Dein problem ist eigentlich nicht mit malloc, sondern vielmehr die Tatsache, dass Sie vorbei sind der Wert, den der Zeiger aktuell hält, anstatt die Adresse. Versuchen Sie Folgendes:
Durch die übergabe des Zeiger-Wert, wie Sie waren, gab es keine Möglichkeit für den Wert malloc erstellt werden gespeichert in die Zeiger.
InformationsquelleAutor der Antwort Dusty