2016-08-01 4 views
3

zugeordnet habe ich eine Lücke Funktionfreien Speicher außerhalb einer Leere Funktion, wo es

void foo(int *ptr) { 
    //trying to allocate memory to hold 5 ints 
    ptr = malloc(sizeof(int)*5): 
    //I loop ptr and assign each with a value i =0 to 4; 
} 

In der Hauptfunktion Ich habe diese Zeilen

int main() { 
    int *num; 
    //I called the function 
    foo(&(num)); 
    free(num); 

    return 1; 
} 

ich munmap_chunk() ungültige Zeigerfehler. Ich habe versucht, mehr Informationen einzubauen, aber ich konnte das nicht herausfinden. Ich weiß, dass es grundlegend für diejenigen sein wird, die in c arbeiten. Ich dachte, ich gehe durch Verweis und es sollte funktionieren, aber es ist nicht. Ich bin neu in C und bisher hatte ich Kopfschmerzen.

+2

Was Sie an 'foo()' ('int **') übergeben und was der Typ des Arguments, das 'foo()' ('int *') erwartet, stimmt nicht überein. Haben Sie keine Warnmeldungen von Ihrem Compiler erhalten? Sie wollten wahrscheinlich 'void foo (int ** ptr) verwenden {* ptr = malloc (...); ...} ' –

+0

@ P.P Wenn Sie Hauptfunktion schauen, übergab ich Zeiger, eine Adresse, die auf einen int zeigt – user1986244

+0

@ user1986244 Tatsächlich übergaben Sie die Adresse eines Zeigers. Ein Zeiger auf einen Zeiger. 'foo()' sollte ein 'int **' erhalten. – itsme86

Antwort

7

ptr eine lokale Variable ist, sein Leben lang mit der Funktion beendet ist, müssen Sie einen Zeiger um Zeiger num in main

void foo(int **ptr) { 
     //trying to allocate memory to hold 5 ints 
     *ptr = malloc(sizeof(int)*5); 
     //I look ptr and assign each with a value i =0 to 5; 
    } 
+0

Es ist nicht für private Nachrichten gedacht, aber ich würde mich freuen, Sie zu kontaktieren. Ich brauche wirklich mehr Einblick, als ich den Kurs in C nahm. Wenn du bereit wärst würde ich mich freuen, meine Emailadresse – user1986244

+0

@ user1986244 - ich glaube du meinst AlterMann, nicht ich; er ist ein wenig nützlicher: ^) Unter SO kannst du über [chatrooms] mit anderen Benutzern chatten (http://meta.stackexchange.com/questions/187426/how-do-ichat-with-another-user -on-stackoverflow). Leider brauchst du 100 Wiederholungen, um einen Chat mit jemandem zu beginnen, aber du wirst bald da sein. –

+1

'aber was ich passiere, ist * num, nur ein Zeiger', nein,' num' ist ein Zeiger, aber die Verwendung von '&' (Adresse von) mit einem Zeiger führt zu einem Zeiger auf den Zeiger. –

1

Für den Anfang verändern die Funktion foo wie

void foo(int *ptr); 
     ^^^^^^^^ 
erklärt

das ist sein Parameter hat Typ int *. Während Sie die Funktion wie

foo(&(num)); 
    ^^^^^^ 

fordern, wo ihr Argument int ** hat geben, da die Variable num wie

int *num; 

Der Compiler sollte mindestens Ausgabe eine Nachricht, die die Typen sind nicht kompatibel deklariert ist.

Sie benötigen die Funktion die folgende Art und Weise

void foo(int **ptr) { 
     ^^^^^^^^^ 
    //trying to allocate memory to hold 5 ints 
    *ptr = malloc(sizeof(int)*5): 
    ^^^^ 
    //I loop ptr and assign each with a value i =0 to 4; 
} 

In diesem Fall ist der Funktionsaufruf richtig sein zu definieren, und als der ursprüngliche Zeiger durch Verweis übergeben wird, wird es nach dem Aufruf der Funktion geändert werden.

wie für die ursprüngliche Funktionsdefinition

void foo(int *ptr) { 
    //trying to allocate memory to hold 5 ints 
    ptr = malloc(sizeof(int)*5): 
    //I loop ptr and assign each with a value i =0 to 4; 
} 

dann seine Parameter ist eine lokale Variable der Funktion, die eine Kopie des Arguments hält. Alle Änderungen der lokalen Variablen, die der Kopie des ursprünglichen Arguments entspricht, haben keinen Einfluss auf den ursprünglichen Zeiger selbst. Nach Verlassen der Funktion wird die lokale Variable (Parameter) ptr zerstört.

+0

Ich glaube, du hast auf eine Frage geantwortet, die ich gerade Alter gestellt habe. Vielen Dank. Ich habe mich gefragt, ob ich nur einen Zeiger mit * num übergeben habe, aber das Hinzufügen von & hat es ** num gemacht, und meine Funktionsdefinition spiegelte das nicht wider. – user1986244

+0

@ user1986244 Der Aufruf der Funktion ist korrekt, wenn Sie den in main deklarierten ursprünglichen Zeiger ändern wollen. Das heißt, die Variable sollte als Referenz übergeben werden. Die Funktionsdefinition ist jedoch falsch, da die Funktion den Zeiger nicht als Referenz akzeptiert. Also ändert es nur seine lokale Variable (Zeiger), die sein Parameter ist. :) –

+0

@thank Sie, wenn ich erlaubt bin, konnte ich Ihnen emailen. Wirklich drei vier Stunden und Tage solche Probleme. – user1986244

Verwandte Themen