elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda puntero en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda puntero en C  (Leído 1,258 veces)
C--

Desconectado Desconectado

Mensajes: 7



Ver Perfil
Duda puntero en 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 :)


« Última modificación: 24 Septiembre 2012, 04:37 am por C-- » En línea

diegoCmC

Desconectado Desconectado

Mensajes: 177



Ver Perfil
Re: Duda puntero en C
« Respuesta #1 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


En línea

a todas las que me abrieron su coraza traeles suerte
ya no creo en el amor pero querria volver a verte
fary
Colaborador
***
Desconectado Desconectado

Mensajes: 958



Ver Perfil WWW
Re: Duda puntero en C
« Respuesta #2 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.
En línea

Un byte a la izquierda.
durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Duda puntero en C
« Respuesta #3 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++)) { }
En línea

Ahorrate una pregunta, lee el man
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda puntero en C
« Respuesta #4 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]
« Última modificación: 24 Septiembre 2012, 23:08 pm por leosansan » En línea

C--

Desconectado Desconectado

Mensajes: 7



Ver Perfil
Re: Duda puntero en C
« Respuesta #5 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 :)
« Última modificación: 25 Septiembre 2012, 02:00 am por C-- » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda doble puntero char a matriz de char
Programación C/C++
neo_from_cs_matrix 3 4,917 Último mensaje 5 Septiembre 2011, 03:53 am
por rir3760
Texto siguiendo puntero en html (duda)
Desarrollo Web
IMPEESA 2 2,259 Último mensaje 27 Septiembre 2011, 03:33 am
por IMPEESA
Duda con puntero a arreglo de caracteres
Programación C/C++
dato000 5 3,325 Último mensaje 30 Noviembre 2012, 21:13 pm
por xiruko
Duda puntero a pila.
Programación General
lanun 0 718 Último mensaje 27 Marzo 2014, 20:05 pm
por lanun
Duda con respecto a puntero a estructura
Programación C/C++
Curioso0078 2 773 Último mensaje 9 Marzo 2017, 18:00 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines