Cómo devolver un puntero como un parámetro de función

2 minutos de lectura

Avatar de usuario de novato
Novato

Estoy tratando de devolver el puntero de datos del parámetro de función:

bool dosomething(char *data){
    int datasize = 100;
    data = (char *)malloc(datasize);
    // here data address = 10968998
    return 1;
}

pero cuando llamo a la función de la siguiente manera, la dirección de datos cambia a cero:

char *data = NULL;
if(dosomething(data)){
    // here data address = 0 ! (should be 10968998)
}

¿Qué estoy haciendo mal?

  • ¿Realmente estás usando C o estás usando C++ (algunos comentarios indican que hablas de referencias de C++).

    – Johannes Schaub – litb

    13 de marzo de 2011 a las 0:16


  • no lo marqué como c++ porque no sabía que importaba y la gente a menudo se queja “eso no es c++ eso es c” porque estoy usando malloc()…

    – Novato

    13 de marzo de 2011 a las 0:18

Estás pasando por valor. dosomething modifica su copia local de data – la persona que llama nunca verá eso.

Utilizar esta:

bool dosomething(char **data){
    int datasize = 100;
    *data = (char *)malloc(datasize);
    return 1;
}

char *data = NULL;
if(dosomething(&data)){
}

  • oh maldición… ya veo, un puntero al puntero… pero ¿no había alguna otra forma de hacer esto? He visto funciones que toman un puntero sin & dentro de él, ¿es posible convertir mi función de esa manera? (me gusta sin y ya que es menos propenso a errores)

    – Novato

    13 de marzo de 2011 a las 0:04


  • Podrías hacerlo char * dosomething(char *) y devolver el nuevo puntero.

    – Erik

    13 de marzo de 2011 a las 0:06

  • pero quiero devolver el valor bool de la función, quise decir si pudiera llamar a la función dosomething(data) en lugar de dosomething(&data) ¿de todos modos? tal vez en c ++?

    – Novato

    13 de marzo de 2011 a las 0:09

  • en c ++ sí, luego use bool dosomething (char * & data) – pasar por referencia

    – Erik

    13 de marzo de 2011 a las 0:10

  • ¿Tiene la persona que llama la responsabilidad de desasignar el puntero en este caso? (eliminar datos o algo así)?

    – Pirata malo

    1 de noviembre de 2011 a las 5:14

int changeme(int foobar) {
  foobar = 42;
  return 0;
}

int  main(void) {
  int quux = 0;
  changeme(quux);
  /* what do you expect `quux` to have now? */
}

Es lo mismo con tu fragmento.

C pasa todo por valor.

¿Ha sido útil esta solución?