Duda puntero en C

Iniciado por C--, 24 Septiembre 2012, 04:24 AM

0 Miembros y 1 Visitante están viendo este tema.

C--

Hola a todos. Soy nuevo aquí y soy principiante en C, por lo que tengo la siguiente duda con este 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:

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

diegoCmC

Porque con a estas reservando el espacio de memoria, con b no, por lo que puedes estar accediendo a zonas donde no puedes escribir
a todas las que me abrieron su coraza traeles suerte
ya no creo en el amor pero querria volver a verte

fary

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.
Un byte a la izquierda.

durasno

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:
while(*(b++)) { }
Ahorrate una pregunta, lee el man

leosansan

#4
Cita de: C-- en 24 Septiembre 2012, 04:24 AMPor qué en la salida obtengo:

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

#include <stdio.h>
int main()
{
   int *a = (int*)malloc(sizeof(int)*3);
   int *b;
   *a = 2;
   *(a+1) = 4;
   *(a+2) = 6;
   *(a+3) = 8;
   *(a+4) = 9;
   b = a;
   *(b+1)=0;/* *(b+1)=*(a+1) = 0*/
    while(*(b++));/* ==> b= b++=*(a+2) = 6*/
   printf("%i, %i, %i\n",*a,*(a+1),*(a+2));
   printf("%i, %i, %i\n",*b,*(b+1),*(b+2));/* *b=*(a+2)=6,*(b+1)=*(a+3)=8,*(b+2)=*(a+4)=9*/
   free(a);
   getchar();
   return 0;
}[code]
Compáralo con el siguiente código:
[code=c]#include <stdio.h>
int main()
{
   int *a = (int*)malloc(sizeof(int)*3);
   int *b;
   *a = 2;
   *(a+1) = 4;
   *(a+2) = 6;
   *(a+3) = 8;
   *(a+4) = 9;
   b = a+1;
   *(b+1)=0;/* *(b+1)=*(a+2) = 6*/
    while(*(b++)) ;/* ==> b= b++=*(a+3) = 8*/
   printf("%i, %i, %i\n",*a,*(a+1),*(a+2));
   printf("%i, %i, %i\n",*b,*(b+1),*(b+2));/* *b=*(a+3)=8,*(b+1)=*(a+4)=9,*(b+2)=*(a+5)"BASURA"*/
   free(a);
   getchar();
   return 0;
}[code]
Saludos
[/code][/code][/code]

C--

#5
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 :)