Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JonaLamper en 28 Febrero 2015, 11:32 am



Título: Pequeña duda con punteros
Publicado por: JonaLamper 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:


    Título: Re: Pequeña duda con punteros
    Publicado por: xiruko 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.