2016-06-21 7 views
-4

Der Wert, der im Function-Pointer "* fun" von der Struktur unten enthalten ist, ist falsch gedruckt und ich finde den Weg nicht richtig zu drucken. Was ist der richtige Code dafür? Der Code:wie man den Wert eines Funktionszeigers aus einer Struktur ausdruckt

struct t {      //structure definition 
    int a; 
    int (*fun) (int a);}; 


int get_a (int a) {   //function definition 
    a = a*2; 
    return a;} 

int main() { 
    t test;      //variable creation 
    get_a(5);     //function activating 
    test.fun = &get_a;   //assignation to the pointer function 
    printf ("%d\n",*(test.fun)); //THE NUMBER 4199360 IS WRITTEN INSTEAD OF '10'. 

    return 0; 
} 
+0

Zuerst 'printf ("% d \ n ", * (test.fun));' ist ** undefiniertes Verhalten **. Zweitens, warum erwarten Sie, dass ein Funktionszeiger einen bestimmten Wert wie 10 hat? –

+0

Es gibt keine standardkonforme Möglichkeit, einen Funktionszeiger auszudrucken. – Olaf

+0

Ich glaube, OP versucht, den Rückgabewert des Funktionszeigers zu drucken, wenn ein Argument von "5" übergeben wird. –

Antwort

2

Sie müssen die Funktion mit dem Argument Wert als 5 auch anrufen, um den Rückgabewert zu drucken, verwenden Sie nicht *, da es nur ein int

printf("%d\n", test.fun(5)); 
0

In Ihrem Titel fragen Sie über das Drucken des Werts eines Funktionszeigers. Es gibt keinen tragbaren Weg, das zu tun. Das printf-Format %p wird für einen Zeigerwert des Typs void* verwendet, aber Sie können einen Funktionszeiger nicht portabel in void* konvertieren. (Auf manchen Systemen eine solche Umwandlung ein sinnvolles Ergebnis hat ergeben, und Sie können einen Funktionszeiger mit

printf("%p\n", (void*)test.fun); 

drucken, aber das ist nicht unbedingt tragbar.)

zeigt jedoch, Ihre Bemerkung, dass Sie, was der Wert gedruckt zu sein 10, was bedeutet, dass Sie versuchen zu drucken, nicht den Wert des Funktionszeigers, sondern den Wert von einem Aufruf an die Funktion zurückgegeben. Um das zu tun, Sie die Funktion verlangen:

printf("%d\n", test.fun(5)); 

Beachten Sie, dass Sie nicht explizit dereferenziert der Funktionszeiger müssen. Ein Funktionsaufruf benötigt tatsächlich einen Funktionszeiger als Präfix. Am häufigsten ist es ein Funktionsname, der implizit in einen Zeiger umgewandelt wird. In diesem Fall ist das Präfix ein tatsächlicher Funktionszeiger, und es wird keine implizite Konvertierung benötigt.

+0

Keith Thompson: Ich bekomme: Fehler: zu wenige Argumente zu funktionieren printf ("% d \ n", test.fun()); –

+0

@SofleshhututHaHaredim: Richtig, Sie müssen alle erforderlichen Argumente übergeben. Ich habe meine Antwort aktualisiert. –

0
#include<stdio.h> 
struct t 
{      
    int a; 
    int *fun; 
}test; 


int get_a (int a) 
{   
    a = a*2; 
    return a; 
} 

int main() { 
    int c; 
    c=get_a(5);     
    test.fun = &c;   
    printf ("%d\n",*(test.fun)); 
    return 0; 
} 

Dies ist der beste Weg, um die Ausgabe zu erhalten, die Änderungen, die ich gemacht haben, ist einfach, nur das Programm starten Sie die Ausgabe 10

0

Zum einen bekommen, sollten Sie die Compiler-Fehler und Warnungen Sie korrigieren hätte bekommen sollen.

t test; 

sollte wirklich

sein
struct t test; 

Sie auch eine Include von stdio.h fehlen. Das eigentliche Problem ist jedoch Ihre Überzeugung, dass der Funktionszeiger irgendwie das a-Feld der Struktur kennt, die ihn enthält. Der Punkt t.fun ist einfach eine Speicheradresse. Die Deklaration teilt dem Compiler mit, dass es die Adresse einer Funktion ist, die int übernimmt und int zurückgibt. Immer wenn Sie erwarten, dass die zugrunde liegende Funktion aufgerufen wird, müssen Sie ihr das erwartete Argument übergeben. So wie es ist, drucken Sie den Wert von allem, was zu Beginn der Funktion kompiliert wurde, eindeutig nicht, was Sie wollen. Wahrscheinlich wollen Sie Sie Hauptfunktion wie diese

int main() { 
struct t test; 
test.a = 5 
test.fun = &get_a; 
printf ("%d\n",test.fun(test.a)); 

return 0; 
} 

Die ursprüngliche Linie suchen Aufruf get_a (5) nichts mit dem Rückgabewert.

Verwandte Themen