Pregunta

main () llama a la función Call_By_Test () con el parámetro argumento primer nodo. Me he liberado el primer nodo de Call_By_Test (), pero la dirección primer nodo no liberado en main (), ¿por qué?.

typedef struct LinkList{
int data;
struct LinkList *next;
}mynode;

void Call_By_Test(mynode * first)
{
        free(first->next);
        first->next = (mynode *)NULL;
        free(first);
        first = (mynode *)NULL;
}
int main()
{
mynode *first;

first = (mynode *)malloc(sizeof(mynode));
first->data = 10;
first->next = (mynode *)NULL;

cout<<"\n first pointer value before free"<<first<<endl;

Call_By_Test(first);
// we freed first pointer in Call_By_Test(), it should be NULL
if(first != NULL)
        cout<< " I have freed first NODE in Call-By-Test(), but  why first node pointer has the value "<<first<<endl;


}

Salida:  primer valor del puntero 0x804b008  Me he liberado primer nodo de Call-by-Test (), pero ¿por qué primer puntero nodo tiene el valor 0x804b008

¿Fue útil?

Solución

Dado que la cuestión se etiqueta c ++, me refactorizar a:

void Call_By_Test( mynode *& first ) // rest of code remains the same

que transmite el paso por referencia sin desreferencias adicionales. Todas las soluciones que proponen pasar un puntero al puntero (void Call_By_Test( mynode ** first )) están utilizando la semántica pase por valor en un puntero a la variable puntero. Mientras que usted puede hacer esto en C ++, el paso por referencia es más clara.

Otros consejos

La respuesta es que no se está usando el paso por referencia. Estás pasando un puntero de valor - y eso no es lo mismo. Eso significa que usted verá los cambios en los datos que el puntero se refiere a, pero cambiando el valor de first sí dentro del método Call_By_Test no hace nada.

En la función

void Call_By_Test(mynode * first)

primero es efectivamente una variable local de la función. Modificación de que no cambiará el estado del resto del programa. Se necesita una referencia a un puntero o un puntero a un puntero:

void Call_By_Test(mynode ** first)
{
        free((*first)->next);
        (*first)->next = NULL;
        free(*first);
        *first = NULL;
}

y llamarlo:

Call_By_Test( & first );

Al hacer:

void Call_By_Test(mynode * first)

copiar en primer lugar, para que pueda trabajar en lo que se encuentra en la primera, pero no se puede cambiar la dirección de la primera, ya que es una copia.

Si desea cambiar el valor primero y luego usted debe tener una función como esta:

void Call_By_Test(mynode ** first)

o

void Call_By_Test(mynode & first)

, que le permiten acceder a la discusión por primera vez como si fuera la variable original (y no una copia de la función principal)

Si free un puntero (como 0x804b008), que no cambia los bits en el propio puntero. Que sólo permite aplicar la biblioteca de C ++ para registrar que la memoria en la dirección de puntas para ya no está en uso, y puede ser reciclado. En su caso, al imprimir 0x804b008, la memoria en la dirección 0x804b008 está disponible para su reutilización por la biblioteca de C ++.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top