2017-10-19 4 views
1

J'ai ce struct:paramètre Struct égale à la valeur aléatoire

typedef struct Graph{ 
    node ** vertices; 
    int vertex_number; 
}Graph; 

Je lance alors cette fonction pour créer un graphique:

void init_graph(Graph *graph){ 
    graph = (Graph *) malloc(sizeof(Graph)); 
    graph->vertices = (node **) malloc(sizeof(node *)); 
    graph->vertex_number = 0; 
} 

et l'exécuter comme ceci:

init_graph(&graph); 
printf("%d", graph.vertex_number); 

Lorsque j'essaie d'imprimer quelle est la valeur de vertex_number du graphique que j'ai créé, au lieu de me donner zéro, il me donne un grand nombre comme 1356352456, ou quelque chose comme ça. Pourquoi cela se passe-t-il et comment puis-je le réparer?

+0

vous ne changez pas le pointeur dans * votre interlocuteur*. En outre, ce n'est pas un [mcve]. Comment 'graph' est-il déclaré? une structure - vous l'avez déjà allouée! il suffit de retirer 'graph = (Graph *) malloc (sizeof (Graph));' et cela fonctionnera ... –

Répondre

0

(dans init_graph) est un paramètre de fonction. Cela signifie que c'est une variable locale dans la fonction (contenant une copie de l'argument). La modification du paramètre n'a aucun effet sur l'appelant de la fonction. En outre, (dans main?) N'est même pas un pointeur. C'est une structure il a déjà de la mémoire allouée pour cela. Si vous supprimez la ligne graph = (Graph *) malloc(sizeof(Graph)) de init_graph, tout devrait fonctionner.


Side note: Vous ne devriez pas cast the return value of malloc.

0

Vous avez cette fonction:

void init_graph(Graph *g) 

et vous l'appelez avec

init_graph(&graph) 

Ce que cela signifie est que vous attribuez le pointeur variable locale g à la valeur de l'adresse de . g est, et sera toujours une variable locale dans init_graph. Ce que vous faites est de lui donner la valeur d'une adresse à une variable en dehors de la fonction. Lorsque vous appelez g=malloc(sizeof(Graph)), vous affectez g à une toute nouvelle valeur, pointant vers un emplacement de mémoire complètement différent. Supprimer cette ligne et vous devriez aller bien.

(j'ai enlevé le casting comme melpomene déjà suggéré. J'ai aussi changé le nom de l'argument init_graph il n'a pas eu le même nom que la variable externe.)