2016-05-01 7 views
-5

Ich erstelle zwei verschiedene Funktionen, von denen beide einen Zeiger verwenden müssen.Speicherbelegung in verschiedenen Funktionen?

Also muss ich malloc in der Funktion verwenden, die ich die Werte des Zeigers eingeben, dann in der Lage sein, die Werte des zugeordneten Zeigers in einer anderen Funktion zu sortieren (dieser Teil funktioniert manchmal, aber verursacht immer das Programm abstürzen) .

Wenn ich malloc in meiner Hauptfunktion verwende, kann ich den Zeiger in beiden meiner benutzerdefinierten Funktionen leicht verwenden, aber wie ich erwähnte, versuche ich, malloc in der Funktion zu verwenden, die ich machte, und mache es in anderen Funktionen arbeiten.

Also meine Frage ist, ist das möglich? Ich möchte auch nicht global malloc (wenn das überhaupt möglich ist).

+3

bitte den Code eingeben? – fluter

+2

Geben Sie den Zeiger von der Funktion zurück, die den Speicher zuweist. –

+0

Wenn ich den Code poste, wird es nur noch verwirrender sein. Es ist ein bisschen groß Programm und verwendet mehrere Dateien. Im Allgemeinen sind meine zwei Funktionen enterdata (Zeiger) und sort_data (Zeiger). Ich muss malloc in "enterdata" verwenden, aber stellen Sie sicher, dass das Programm nicht abstürzt, wenn ich danach sort_data benutze. – Axel1212

Antwort

0

Ohne den Code kann ich nicht viel helfen, aber in der Funktion, die malloc hat, nur diese Funktion den Zeiger zurückgeben. Sie könnten auch haben, dass diese Funktion einen Zeiger auf einen Zeiger nimmt und ihn so verteilt.

Way 1

void* f1() 
{ 
    return malloc(szData); 
} 

void f2(void* ptr) 
{ 
    // do stuff with pointer 
} 

int main() 
{ 
    void* ptr = NULL; 
    ptr = f1(); 
    f2(ptr); 
    free(ptr); 
} 

Way 2

void f1(void** ptr) 
{ 
    *ptr = malloc(szData); 
} 

void f2(void* ptr) 
{ 
    // do stuff with pointer 
} 

int main() 
{ 
    void* ptr = NULL; 
    f1(&ptr); 
    f2(ptr); 
    free(ptr); 
} 

Es gibt viele verschiedene Wege, dies zu tun. Ich hoffe, diese beiden Beispiele sind genug für Sie, um Ihr Problem zu lösen.

+0

Danke! Die 2. Methode funktionierte wie ein Zauber. – Axel1212

+0

Sie sollten diesen Speicher freigeben. – Michi

+0

@GregM: Wenn Sie die Runtime-Release-Ressourcen reservieren, die Sie reservieren, ist der Codierungsstil schlecht. Wenn Sie Speicher reservieren, sollten Sie ihn "befreien". (Das Gleiche gilt für Dateien usw.) Sie überprüfen die Ergebnisse nicht und verwenden ein Zeigerargument, um einen Wert zurückzugeben, obwohl die Funktion "void" auch ein schlechter Stil ist. Es ist viel besser, den Zeiger zurückzugeben. Schließlich hat 'main' eine entmutigende Unterschrift. Verwenden Sie Prototyp-Deklaratoren. – Olaf