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?
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 dedosomething(&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.
¿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