[C] Problemino con i puntatori

Pablitos23
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.

#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
Pablitos23
In questo modo funziona. Perchè nel caso precedente no ed in questo si??

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 :D

vict85
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 .

Pablitos23
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??

vict85
Perché hai passato il puntatore per valore e quindi ogni modifica a root dentro insert non modifica il root del main.

Pablitos23
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.

vict85
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.

Pablitos23
Grazie per le varie delucidazioni molto importanti. Buon week end :)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.