2010-02-01 4 views
6

Je dois créer une structure dans une fonction (dynamiquement avec malloc) Ensuite, je dois être en mesure de l'envoyer à mon principal, et l'utiliser là. Je n'ai aucun problème à le créer, j'ai juste besoin d'aide pour l'envoyer à mon principal, et je ne suis pas sûr de la façon d'y accéder une fois que je l'ai là.Retour structure de la fonction (C)

struct retValue * fn() { 
struct retValue 
{ 
    int number; 
}; 

struct retValue* st = malloc(sizeof(*st)); 


return(???); 
} 

C'est le code que j'ai jusqu'à présent.

Merci pour toute aide. Faites-moi savoir si vous avez besoin de quelque chose de clarifié.

EDIT:

Ok Une clarification est nécessaire. Ce que j'essaye d'accomplir, est la capacité de passer une structure par l'intermédiaire d'une fonction à mon principal. Dans la fonction, je dois déclarer des variables et leur assigner des valeurs. Ensuite, dans l'ensemble, je dois imprimer chaque variable de la structure à l'écran. Aucune variable globale ne peut être utilisée (et donc je n'adopte aucune structure globale).

Espérons que cela clarifie les choses.

EDIT 2:

J'ai compris mon problème. Pour ceux qui étaient intéressés, j'avais besoin d'avoir le prototype de structure en dehors de mes fonctions en premier. Ensuite, je pourrais passer st et ensuite y accéder correctement. Merci à tous, et désolé pour la mauvaise formulation.

+0

Les variables globales et les structures globales sont différentes. En définissant la structure def global, vous ne définissez qu'un type et non une variable. Si vous ne faites pas la structure def globale, les autres fonctions ne connaîtront rien de ce nouveau * type * et votre prg ne se compilera pas. – codaddict

Répondre

8
// make the structure def global so that main() and fun() know about it. 
struct retValue { 
int number; 
};  

// function fn returns a pointer to the structure retValue 
struct retValue * fn() {  

struct retValue* st = malloc(sizeof(*st)); 

// return the pointer to the newly allocated structure. 
return(st); 
} 

int main() { 

// call fn() to create a new structure dynamically. 
struct retValue *st = fn(); 
} 
4

Vous obtiendrez des centaines de réponses à cette question. :)

  1. Vous pouvez renvoyer un pointeur directement. Par exemple. return st, Votre fonction principale sera alors en mesure d'accéder aux membres de la structure comme dans st->number. Assurez-vous que le pointeur principal est free quand c'est fait.

  2. Ce n'est pas nécessairement un modèle de conception génial. Votre appelé (fn) alloue de la mémoire, mais votre interlocuteur (principal) doit gérer les conséquences. Vous pouvez également structurer ceci avec l'allocation principale de la mémoire (en utilisant malloc ou directement sur la pile) et en passant le pointeur pour utiliser fn. Alors le malloc/libre arrive au même endroit. Sinon, vous voulez être sûr de nommer votre fonction fn quelque chose de clair comme allocateMyStructure alors il est clair que le retour doit être libéré.

P.S. Je ne suis pas sûr des règles pour définir les structures à l'intérieur d'une fonction, mais vous ne devriez pas le faire ici. Déclarez struct retValue au-dessus de main et de votre fonction fn, afin qu'ils puissent "voir" le type déclaré.

+0

Je ne pense pas que ce soit un problème d'allocation de mémoire dans une fonction, tant que le nom de la fonction est clair (quelque chose comme CreateNewFoo() ou quelque chose). Sinon, je suis d'accord avec vous. –

0

Veuillez déclarer la structure dans un fichier d'en-tête commun et l'inclure dans votre fichier source, puis renvoyer st depuis votre fonction actuelle. Cela devrait fonctionner.

0
struct retValue { int number; }; 

int main(...) { 
    struct retValue *myval; 

    myval = fn(); 
} 

struct retValue *fn() { 
    struct retValue* st = malloc(sizeof(*st)); 

    return st; 
} 
1

Une chose que je voudrais souligner ... puisque la structure est locale à la fonction, est-il une structure globale qui correspond exactement à qui, sinon vous pourriez avoir des ennuis, comment main() savoir ce qu'il y a dans cette structure? Pouvez-vous clarifier?

Modifier: Il semble que ma réponse a confirmé ce que je pensais.

 
struct retValue 
{ 
    int number; 
}; 

int main(int argc, char **argv){ 
    struct retValue *ptr; 
    ptr = fn(); 
    /* do what you have to do... */ 
    .... 
    return 0; 
} 

struct retValue * fn() { 
    struct retValue* st = malloc(sizeof *st); 

    /* do you work on the structure */ 
    st->number = 5; 

    return st; 
} 

Par ailleurs quelqu'un posté this plus tôt aujourd'hui.

Espérons que cela aide, Cordialement, Tom.

Questions connexes