[C] Problemino con i puntatori
Perchè non riesco ad assegnare al puntatore al nodo root, l'indirizzo del nuovo nodo da inserire??
Creo il puntatore ad un nuovo nodo e assegno l'indirizzo di questo puntatore al puntatore al nodo root, ma non funziona.
Creo il puntatore ad un nuovo nodo e assegno l'indirizzo di questo puntatore al puntatore al nodo root, ma non funziona.
#include <stdio.h> #include <stdlib.h> typedef struct { int value; struct Node *left; struct Node *right; struct Node *parent; }Node; int getNewNode(int data){ Node *n = malloc(sizeof(Node)); (*n).value = data; n->left = n->right = n->parent = NULL; return &(*n); //ritorno l'indirizzo del nuovo oggetto } void insert(Node *root, int data){ if( root == NULL){ root = getNewNode(data); //assegno il nuovo indirizzo al vecchio puntatore } return; } int main(void) { Node *root = NULL; insert(root,5); if(root!=NULL){ printf("Value of root: %d", root->value); } return 0; }
Risposte
In questo modo funziona. Perchè nel caso precedente no ed in questo si??
Risolto è un problema di visibilità e di passaggio dei parametri per valore o per riferimento.
Questa slide lo spiega in modo sintetico ma efficace.
http://home.deib.polimi.it/plebani/down ... ametri.pdf
Altri chiarimenti sono ben accetti
int getNewNode(int data){ Node *n = malloc(sizeof(Node)); (*n).value = data; n->left = n->right = n->parent = NULL; return &(*n); //ritorno l'indirizzo del nuovo oggetto } void insert(Node **root, int data){ if( *root == NULL){ *root = getNewNode(data); //assegno il nuovo indirizzo al vecchio puntatore } } int main(void) { Node *root = NULL; insert(&root,5);
Risolto è un problema di visibilità e di passaggio dei parametri per valore o per riferimento.
Questa slide lo spiega in modo sintetico ma efficace.
http://home.deib.polimi.it/plebani/down ... ametri.pdf
Altri chiarimenti sono ben accetti

getNewNode dovrebbe ritornare un puntatore a Node e non un int. Tra l'altro un puntatore è spesso un 64bit in programmi a 64bit, contro i 32 degli int.
Tra l'altro &(*n) non è altro che n. Similmente (*n).value è equivalente a n->value .
Tra l'altro &(*n) non è altro che n. Similmente (*n).value è equivalente a n->value .
Sei statp chiaro, ma perchè nella prima versione al puntatore 'root' non può essere assegnato un altro indirizzo a cui puntare?
Nella funzione la variabile root avrà un'altra visibilità e sarà solamente una copia di root??
Nella funzione la variabile root avrà un'altra visibilità e sarà solamente una copia di root??
Perché hai passato il puntatore per valore e quindi ogni modifica a root dentro insert non modifica il root del main.
Ho capito quindi passandogli il riferimento i cambiamenti non restano locali alla funzione ma si verificano anche all'esterno.
In Java il passaggio dei parametri avviene sempre per valore per i tipi primitivi e per indirizzo per gli oggetti.
Si potrebbe risolvere o dichiarando globale una variabile oppure assegnando alla variabile il nuovo valore di ritorno della funzione o modificando gli indirizzi che puntano all'oggetto.
In Java il passaggio dei parametri avviene sempre per valore per i tipi primitivi e per indirizzo per gli oggetti.
Si potrebbe risolvere o dichiarando globale una variabile oppure assegnando alla variabile il nuovo valore di ritorno della funzione o modificando gli indirizzi che puntano all'oggetto.
Pensare come Java mentre programmi in C o C++ è una pessima scelta. Java possiede un garage collector, C e C++ richiedono di gestire allocazioni e deallocazioni manualmente. Inoltre il C non è né strong typed né ad oggetti.
Grazie per le varie delucidazioni molto importanti. Buon week end
