2016-08-27 2 views
0

J'ai utilisé des pointeurs de fonction dans c pour créer une structure générique. Lorsque j'appelle une fonction spécifique, l'un des paramètres est un paramètre de sortie. J'attribue la mémoire à l'intérieur de la fonction spécifique mais cela ne fonctionne pas. aimerait de l'aide!Passage et allocation de pointeur sur void * dans c

typedef void *PhaseDetails; 
typedef Result (*Register)(const char *, PhaseDetails *); 

Result Func(const char *file, Register register1){ 
    PhaseDetails firstPhase = NULL; 
    Result res = register1(file, &firstPhase); 
} 

int main() { 
    OlympicSport os = Func("men100mList.txt", (Register) registerMen100m); 
    return 0; 
} 

Result registerMen100m(const char *file, 
    Men100mPhaseDetails *firstPhase) { 
    firstPhase = malloc(sizeof(*firstPhase)); 
    if (firstPhase == NULL) { 
     return OG_MEMORY_ALLOCATION_FAILED; 
    } 
    *firstPhase = malloc(sizeof(**firstPhase)); 
    (*firstPhase)->phaseName = malloc(sizeof(char)*12); 
    return OG_SUCCESS; 
} 

le problème est que les firstPhase retours que NULL

+0

Vous n'appelez jamais 'Func'. Cela devrait-il être 'Result osCreate'? – Barmar

+1

Parce que le paramètre est passé par valeur (ou copier si vous préférez), il n'est pas modifié par la fonction (fonction modifie sa copie). Ajouter un autre niveau d'indirection. (Notez que la plupart de votre code est faux, mauvais appels de fonction, types, etc). –

+0

que voulez-vous dire par "Ajouter un autre niveau d'indirection"? – ylilit

Répondre

0

Le problème est que vous passez un pointeur vers firstPhase (défini dans Func()) dans l'argument firstPhase de la fonction registerMen100m() mais, comme première chose dans la fonction, vous l'écrasez avec l'adresse d'un bloc de mémoire nouvellement alloué.

Après que la valeur de firstPhase dans la fonction Func() n'est pas, et ne peut pas, être changé à l'intérieur registerMen100m()

Result registerMen100m(const char *file, Men100mPhaseDetails *firstPhase) 
{ 
    /* At this point, firstPhase holds the address of the variable 
    ** 'firstPhase' you defined in the 'Func()' function. 
    */ 
    firstPhase = malloc(sizeof(*firstPhase)); 
    /* And now it doesnt! So you will never be able to get anything back 
    */ 

    if (firstPhase == NULL) {return OG_MEMORY_ALLOCATION_FAILED;} 

    /* The result of the following malloc is stored in the memory space you 
    ** allocated earlier! If you remove the two lines above you 
    ** should most probably get what you wanted. 
    */ 
    *firstPhase = malloc(sizeof(**firstPhase)); 
    (*firstPhase)->phaseName = malloc(sizeof(char)*12); 
    return OG_SUCCESS; 
} 

Comme une remarque générale en utilisant le même nom fait autour de sens que si cela signifie que le samething partout. Ici vous avez firstPhase avec deux sens différents dans deux fonctions différentes et cela rend difficile de raisonner sur ce qui se passe. De même, passer des fonctions comme arguments est quelque chose dont vous avez rarement besoin. Y a-t-il une raison particulière pour laquelle vous avez structuré le programme de cette façon?