2016-05-11 8 views
-4

Betrachten wir zwei Fälle von den Aufruf einer Funktion:C - Funktionsparameter und Zeiger

void Convert(int number, int **staticPointer) 
{ 
    int * dynamicPointer = malloc(sizeof(int)); 
    *dynamicPointer = number; 
    *staticPointer = dynamicPointer; 
} 

int main() 
{ 
    int *p; 

    Convert(5, &p); 

    printf("The number is: %d", *p); 

    free(p); 
} 

Die oben genannten Arbeiten schön ohne Probleme.

nun der Fall unter:

void Convert(int number, int *staticPointer) 
{ 
    int * dynamicPointer = malloc(sizeof(int)); 
    *dynamicPointer = number; 
    staticPointer = dynamicPointer; 
} 

int main() 
{ 
    int *p; 

    Convert(5, p); 

    printf("The number is: %d", *p); 

    free(p); 
} 

Dies verursacht SEGFAULT. Beachten Sie, dass ich die Funktion auf verschiedene Arten mit verschiedenen Parametern anrufe, und ich verstehe, dass der Unterschied im Aufruf der Funktion liegt.

Kann mir bitte jemand erklären, warum ich die Funktion wie im ersten Beispiel aufrufen muss, und warum das andere Beispiel nicht funktioniert (es stürzt in main ab)?

Der Zweck meines Programms ist es, einen statischen Zeiger auf eine bestimmte Speicheradresse durch eine Funktion zu verweisen.

+1

Die erste ändert den Zeiger in der 'main()' -Funktion; die zweite ändert die Kopie des Zeigers in der 'Convert()' Funktion, ändert aber nicht den Zeiger in der 'main()' Funktion, so dass der Zeiger in 'main()' nicht initialisiert ist und Sie Glück haben einen Absturz bekommen, um zu sagen, dass du es falsch machst (das war nicht garantiert). –

Antwort

0

Es gibt zwei Dinge, die Sie zu ändern:

  • Funktionstyp
  • Funktionsaufruf

Da Sie den Zeiger Wert ändern möchten, können Sie einen Zeiger auf den Zeiger zu bieten haben zu int.

Siehe resources über Zeiger auf Zeiger.

0

C verwendet den Übergabewert für die Übergabe von Funktionsparametern.

  • Im ersten Fall durch die Adresse derp Zeiger vorbei, konnten Sie den Zeiger selbst ändern. Also, im main(), Ihre Änderungen sind reflektiert.

  • Im zweiten Fall kann der Zeiger selbst nicht geändert werden, da er selbst als Wert übergeben wird. Sobald Sie von der Funktion Convert() zurückkehren, gehen alle Änderungen, die an vorgenommen wurden, verloren. In main() werden Sie auf ungültigen Speicher (*p) zugreifen, der undefined behavior nvokes. Daher der Absturz.