[C con Clase] Prioridad operadores. Punteros a struct

Marving jr.marving en gmail.com
Lun Abr 21 18:12:35 CEST 2014


Hola.
Trasteando con los operadores y punteros a struct. Tengo un par de dudas, relacionadas con los resultados obtenidos, y me gustaría que me ayudaseis
a conocer la lógica de los operadores . . .
struct Cliente 
     {
         char* nombre;
         int edad;
         char answer;
     }clnt;
     
     struct Cliente* ptr_strct = &clnt;
     ptr_strct->nombre = "Bjarne Stroustrup";
     ptr_strct->edad = 63;
     ptr_strct->answer = 'Y';
     
     cout << sizeof(ptr_strct) << endl;
     cout << sizeof(ptr_strct->nombre) << endl;
     cout << sizeof(ptr_strct->edad) << endl;
     cout << sizeof(ptr_strct->answer) << endl;
     
     cout << "Dirección de memoria " << ptr_strct << endl;
     cout << "Contenido            " << ptr_strct->nombre << endl;
     
     //*****************************************************
     cout <<"*ptr_strct++->nombre " << *ptr_strct++->nombre << endl;      
     //*****************************************************     
     
     cout << "Dirección de memoria " << ptr_strct << endl;
     cout << "Contenido            " << ptr_strct->nombre << endl;
     cout << "------------------------" << endl;
     
     //----------------------------------------------------------
     ptr_strct = &clnt;
     cout << "Dirección de memoria " << ptr_strct << endl;
     cout << "Contenido            " << ptr_strct->nombre << endl;
     
     //***********************************************
     cout <<  ++*ptr_strct->nombre << endl;   
     //***********************************************
     
     cout << "Dirección de memoria " << ptr_strct << endl;
     cout <<  ptr_strct->nombre << endl;
     //----------------------------------------------------------

Output:
4
4
4
1
Dirección de memoria 0xbfabf634
Contenido            Bjarne Stroustrup
*ptr_strct++->nombre B
Dirección de memoria 0xbfabf640
Contenido            UWVS�i
------------------------
Dirección de memoria 0xbfabf634
Contenido            Bjarne Stroustrup

RUN FINISHED; Segmentation fault; core dumped; real time: 400ms; user: 0ms; system: 0ms
------------------------------------------------------------------------------------------------
     
En la siguiente línea, según lo que tengo entendido
cout <<"*ptr_strct++->nombre " << *ptr_strct++->nombre << endl; 
Tenemos el operando ptr_strct
sobre el operan los operadores
*	y	++->
Operador unario postincremento ++ tiene la misma prioridad que -> seleccion miembros apuntador
* desreferencia tiene menor prioridad
Conflicto entre ++->. Tienen asociatividad izquierda derecha. Entonces
1º	ptr_strct++->nombre		// aumento el puntero char* nombre
2      *((ptr_strct++)->nombre)		// lee el contenido de ese puntero	j

Sin embargo lo que parece que hace es
1º	ptr_strct->nombre
2º      *(ptr_strct->nombre)		// B
3º      ptr_strct++			// Aumenta ptr_strct su sizeof

---------------------------------------------------------------------
En la siguiente línea según lo que tengo entendido
cout <<  ++*ptr_strct->nombre << endl;  
Tenemos el operando ptr_strct
sobre el operan
++*	y	->
-> tiene mayor prioridad que preincremento ++ y desreferencia *
1º	ptr_strct->nombre
Conflicto entre ++**. Tiene asociatividad derecha izquierda
2º	*(ptr_strct)->nombre;	        // 'B'
3º      ++(*(ptr_strct)->nombre);	// ++'B'

Podría haber aparecido algun mensaje del tipo lvalue required ++
Sin embargo aparece el mensaje
RUN FINISHED; Segmentation fault; core dumped; real time: 400ms; user: 0ms; system: 0ms

---------------------------------------------------------------------
Saludos


Más información sobre la lista de distribución Cconclase