2011-03-12 26 views
12

Estoy intentando devolver el puntero de datos del parámetro de función:Cómo devolver un puntero como un parámetro de la 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?

+1

¿Estás realmente usando C o estás usando C++ (algunos comentarios indican que hablas de referencias de C++). –

+0

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() ... – Rookie

Respuesta

21

Usted está pasando por valor. dosomething modifica su copia local de data - la persona que llama nunca lo verá.

Utilice esta:

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

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

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 & en él, ¿es posible convertir mi función de esa manera? (me gusta sin & ya que es menos propenso a errores) – Rookie

+0

Podría hacer 'char * dosomething (char *)' y devolver el nuevo puntero. – Erik

+0

pero quiero devolver el valor de bool de la función, me refiero a si pudiera llamar a la función 'dosomething (data)' en lugar de 'dosomething (& data)' de alguna manera? tal vez en c + + – Rookie

2
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 su fragmento.

C pasa todo por valor.

Cuestiones relacionadas