Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: C-- en 24 Septiembre 2012, 04:24 am



Título: Duda puntero en C
Publicado por: C-- en 24 Septiembre 2012, 04:24 am
Hola a todos. Soy nuevo aquí y soy principiante en C, por lo que tengo la siguiente duda con este código:

Código:
#include <stdio.h>

int main(){
    
     int *a = (int*)malloc(sizeof(int)*3);
     int *b;
     *a = 2;
     *(a+1) = 4;
     *(a+2) = 6;
     b = a;
     *(b+1)=0;
     while(*(b++));
     printf("%i, %i, %i\n",*a,*(a+1),*(a+2));
     printf("%i, %i, %i\n",*b,*(b+1),*(b+2));
     free(a);
     getchar();
     return 0;
    
}

Por qué en la salida obtengo:

Código:
2, 0, 6
6, 1314869318, -1856398723

¿Por qué con ese while pareciera que "desaparecieran" los valores de los punteros iniciales de b?

*Nótese que es ";" al final del while y no un "{", y no hay ninguna línea de código dentro del while.


Saludos y gracias :)


Título: Re: Duda puntero en C
Publicado por: diegoCmC en 24 Septiembre 2012, 09:49 am
Porque con a estas reservando el espacio de memoria, con b no, por lo que puedes estar accediendo a zonas donde no puedes escribir


Título: Re: Duda puntero en C
Publicado por: fary en 24 Septiembre 2012, 16:10 pm
Es por el while, si lo comentas te vas a ver que "b" apunta correctamente a "a". Qué quieres hacer realmente con ese while?

un saludo.


Título: Re: Duda puntero en C
Publicado por: durasno en 24 Septiembre 2012, 16:22 pm
Citar
¿Por qué con ese while pareciera que "desaparecieran" los valores de los punteros iniciales de b?
no es que "desaparecen", el problema es que estas modificando el puntero "b" al hacer b++ (revisa aritmetica de punteros)

 
Citar
*Nótese que es ";" al final del while y no un "{", y no hay ninguna línea de código dentro del while.
se pone el ";" ya que el while no tiene ningun bloque a ejecutar, todo se hace en la condicion... Con las llaves seria:
Código
  1. while(*(b++)) { }


Título: Re: Duda puntero en C
Publicado por: leosansan en 24 Septiembre 2012, 21:39 pm
Por qué en la salida obtengo:

Código:
2, 0, 6
6, 1314869318, -1856398723
¿Por qué con ese while pareciera que "desaparecieran" los valores de los punteros iniciales de b?
Previamente has igualado b a a+0,  seguido de asignar b+1 a a+1, por lo que en el while, al incrementar b pasa a apuntar a a+2=6  y posteriormente  b+1 y b+2 tomarían los valores de a+3 y a+4 ¡¡¡ y como no los tienes definidos se llena, de basura!!"!!!.
Fíjate que en el siguiente código ya no habrá "basura":

Código
  1. #include <stdio.h>
  2. int main()
  3. {
  4.    int *a = (int*)malloc(sizeof(int)*3);
  5.    int *b;
  6.    *a = 2;
  7.    *(a+1) = 4;
  8.    *(a+2) = 6;
  9.    *(a+3) = 8;
  10.    *(a+4) = 9;
  11.    b = a;
  12.    *(b+1)=0;/* *(b+1)=*(a+1) = 0*/
  13.     while(*(b++));/* ==> b= b++=*(a+2) = 6*/
  14.    printf("%i, %i, %i\n",*a,*(a+1),*(a+2));
  15.    printf("%i, %i, %i\n",*b,*(b+1),*(b+2));/* *b=*(a+2)=6,*(b+1)=*(a+3)=8,*(b+2)=*(a+4)=9*/
  16.    free(a);
  17.    getchar();
  18.    return 0;
  19. }[code]
  20. Compáralo con el siguiente código:
  21. [code=c]#include <stdio.h>
  22. int main()
  23. {
  24.    int *a = (int*)malloc(sizeof(int)*3);
  25.    int *b;
  26.    *a = 2;
  27.    *(a+1) = 4;
  28.    *(a+2) = 6;
  29.    *(a+3) = 8;
  30.    *(a+4) = 9;
  31.    b = a+1;
  32.    *(b+1)=0;/* *(b+1)=*(a+2) = 6*/
  33.     while(*(b++)) ;/* ==> b= b++=*(a+3) = 8*/
  34.    printf("%i, %i, %i\n",*a,*(a+1),*(a+2));
  35.    printf("%i, %i, %i\n",*b,*(b+1),*(b+2));/* *b=*(a+3)=8,*(b+1)=*(a+4)=9,*(b+2)=*(a+5)"BASURA"*/
  36.    free(a);
  37.    getchar();
  38.    return 0;
  39. }[code]
  40. Saludos
[/code][/code][/code]


Título: Re: Duda puntero en C
Publicado por: C-- en 25 Septiembre 2012, 01:55 am
Me di cuenta de lo que estaba realmente sucediendo cuando dejé de ver el código y me fui a cenar :P
Lo que pasa es que estaba interpretando una simple "lectura" de q en vez de una asignación a ésta (Duh!). Y al ver los ejemplos que dieron, lo corroboraron.

Muchísimas gracias :)