[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