Tu programa tiene problemas gravísimos, es raro que siquiera te funcione de manera inocua.
Variables usadas fuera de su ámbito.
En la función trocear
creas la variable salida
de tipo puntero a caracter char *
y devuelves ese puntero, el cuál, dado que pertenece a la función trocear
cuando sales de dicha función deja de existir y se pierde. Usar los valores de una variable que ha dejado de existir es un comportamiento indefinido.
Aritmética de punteros mal usada.
La variable salida
es un puntero que no apunta a ningún dato existente. Los punteros existen para apuntar a datos (lee este hilo) y sólo cuando apuntan a algo tienen sentido. En tu caso creas el puntero pero no le asignas valor:
char *salida;
Lo que implica que apunta a un lugar desconocido de la memoria (las variables no inicializadas reciben un valor indeterminado al crearse), desde ese lugar desconocido haces aritmética de punteros para apuntar a diferentes puntos partiendo de un origen desconocido:
*(salida+i)=num%10+'0';
Esa línea se traduce como: "Desde el punto en el que estás, avanza i
posiciones y en ese punto escribe el valor indicado", el problema es que sin saber el punto desde el que empiezas, difícilmente sabrás el punto al que vas... esto es otro comportamiento indefinido.
Propuesta.
Si quieres trabajar con punteros (yo no lo haría, pero si es un requerimiento necesitaremos adherirnos al mismo), necesitarás usar memoria dinámica en lugar de memoria automática (la memoria automática se libera al abandonar el ámbito en que se crea, la memoria dinámica se libera a mano) así que tu función trocear
debería tener este aspecto:
char * trocear(int num) {
// Un entero de 32 bits puede contener números de hasta 10 dígitos
char *salida = new char[11];
// hacer cosas...
return salida;
}
Con esta propuesta, la memoria que has creado en trocear
deberá ser liberada tras su uso:
char *n = trocear(123456);
cout << n;
delete[] n; // <---- MUY IMPORTANTE
Pero hacer esto es un dolor de cabeza importante, te aconsejo usar punteros inteligentes:
std::unique_ptr<char[]> trocear(int num) {
// Un entero de 32 bits puede contener números de hasta 10 dígitos
auto salida = std::make_unique<char[]>(11);
for (int digito = 0; num; ++digito)
{
salida[digito] = '0' + num % 10;
num /= 10;
}
return salida;
}
El puntero inteligente se encargará de liberar la memoria al finalizar su uso, liberándote de la responsabilidad de hacerlo a mano:
auto n = trocear(123456);
cout << n.get();
Puedes ver el código funcionando en Wandbox.