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)
| | |-+  Pequeña duda con punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pequeña duda con punteros  (Leído 1,619 veces)
JonaLamper


Desconectado Desconectado

Mensajes: 394



Ver Perfil
Pequeña duda con punteros
« en: 28 Febrero 2015, 11:32 am »

Buenas. Quiero ver si he entendido este pequeño problema, así que voy a decir lo que está mal o lo que está bien y vosotros me dais el visto bueno  ;D

Tenemos el siguiente código erróneo:

Código
  1. #include <stdio.h>
  2. void dosomething(int *ptr);
  3.  
  4. void main() {
  5.    int *p;
  6.    dosomething(p)
  7.    printf("%d", *p); /* will this work ? */
  8. }
  9.  
  10. /* passed by reference */
  11. void dosomething(int *ptr){
  12.    int temp=32+12;
  13.    *ptr = temp;
  14. }

Está mal porque el puntero *p no puede almacenar el valor 44 (32+12), sino que debe almacenar una dirección de memoria.

Dos soluciones:
 
  • Primera:
Código
  1. #include <stdio.h>
  2.  
  3. void dosomething(int *ptr);
  4.  
  5. void main() {
  6.    int a;
  7.    int *p=&a;
  8.    dosomething(p)
  9.    printf("%d", *p); /* will this work ? */
  10. }
  11.  
  12. /* passed by reference */
  13. void dosomething(int *ptr){
  14.    int temp=32+12;
  15.    *ptr = temp;
  16. }

Es correcto porque a *p le asignamos la dirección de memoria de a, y al hacer *ptr = temp la variable a pasará a valer 44.

  • Segunda:

Código
  1. #include <stdio.h>
  2.  
  3. void dosomething(int *ptr);
  4.  
  5. void main() {
  6.    int *p = malloc(sizeof(int));
  7.    dosomething(p)
  8.    printf("%d", *p); /* will this work ? */
  9.    free(p);
  10. }
  11.  
  12. /* passed by reference */
  13. void dosomething(int *ptr){
  14.    int temp=32+12;
  15.    *ptr = temp;
  16. }

    Correcta porque al puntero *p se le indica que apunte a una dirección de memoria (asignada por malloc) que podrá guardar un valor de tipo int, en este caso almacenará el valor 44.

    ¿Está todo bien entendido?  :rolleyes:


    En línea

    Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.
    xiruko


    Desconectado Desconectado

    Mensajes: 438


    Ver Perfil
    Re: Pequeña duda con punteros
    « Respuesta #1 en: 28 Febrero 2015, 13:09 pm »

    Tenemos el siguiente código erróneo:

    Código
    1. #include <stdio.h>
    2. void dosomething(int *ptr);
    3.  
    4. void main() {
    5.    int *p;
    6.    dosomething(p)
    7.    printf("%d", *p); /* will this work ? */
    8. }
    9.  
    10. /* passed by reference */
    11. void dosomething(int *ptr){
    12.    int temp=32+12;
    13.    *ptr = temp;
    14. }

    Está mal porque el puntero *p no puede almacenar el valor 44 (32+12), sino que debe almacenar una dirección de memoria.

    No es exactamente eso. Está mal porque p no apunta a ninguna dirección de memoria, nunca ha sido inicializado por lo que no hay un espacio de memoria donde guardar ese valor entero.


    Dos soluciones:
     
    • Primera:
    Código
    1. #include <stdio.h>
    2.  
    3. void dosomething(int *ptr);
    4.  
    5. void main() {
    6.    int a;
    7.    int *p=&a;
    8.    dosomething(p)
    9.    printf("%d", *p); /* will this work ? */
    10. }
    11.  
    12. /* passed by reference */
    13. void dosomething(int *ptr){
    14.    int temp=32+12;
    15.    *ptr = temp;
    16. }

    Es correcto porque a *p le asignamos la dirección de memoria de a, y al hacer *ptr = temp la variable a pasará a valer 44.

    Este código es casi igual que antes, con la única diferencia que ahora p sí que está inicializado, apunta a la dirección de memoria de la variable a, por lo que ahora guardar un valor en *p sí que se puede.

    • Segunda:

    Código
    1. #include <stdio.h>
    2.  
    3. void dosomething(int *ptr);
    4.  
    5. void main() {
    6.    int *p = malloc(sizeof(int));
    7.    dosomething(p)
    8.    printf("%d", *p); /* will this work ? */
    9.    free(p);
    10. }
    11.  
    12. /* passed by reference */
    13. void dosomething(int *ptr){
    14.    int temp=32+12;
    15.    *ptr = temp;
    16. }

      Correcta porque al puntero *p se le indica que apunte a una dirección de memoria (asignada por malloc) que podrá guardar un valor de tipo int, en este caso almacenará el valor 44.

      Este caso también es casi igual al primero, solo que ahora p también está inicializado, aunque esta vez en lugar de apuntar a la dirección de una variable existente (como a a antes), se reserva memoria explícitamente para él con malloc().

      Saludos.


      En línea

      Páginas: [1] Ir Arriba Respuesta Imprimir 

      Ir a:  

      Mensajes similares
      Asunto Iniciado por Respuestas Vistas Último mensaje
      Pequeña duda con un comando batch (NUEVA DUDA RELACIONADA)
      Scripting
      revenge1252 9 10,223 Último mensaje 13 Febrero 2008, 21:41 pm
      por revenge1252
      [C] - Duda punteros
      Programación C/C++
      h0oke 2 2,595 Último mensaje 23 Mayo 2010, 02:19 am
      por h0oke
      Duda con punteros
      Programación C/C++
      cazagavilan 5 3,231 Último mensaje 14 Abril 2012, 05:47 am
      por cazagavilan
      Duda Punteros Dobles/Array de punteros
      Programación C/C++
      MisterJava 2 5,167 Último mensaje 30 Diciembre 2012, 20:19 pm
      por MisterJava
      Pequeña duda sobre punteros « 1 2 »
      Programación C/C++
      PabloPbl 15 4,942 Último mensaje 26 Diciembre 2015, 12:44 pm
      por kondrag_X1
      WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines