Este es un error peligroso que acecha en su código. En C y C++ no está permitido devolver un puntero para apilar datos en una función. Resulta en un comportamiento indefinido. Explicaré por qué.
Un programa C/C++ funciona presionando datos dentro y fuera de la pila de programas. Cuando llamas a una función, todos los parámetros se insertan en la pila y luego todas las variables locales también se envían a la pila. A medida que el programa se ejecuta, puede empujar y hacer estallar más elementos dentro y fuera de la pila en su función. En su ejemplo, el buffer se inserta en la pila, y luego se empuja t en la pila . La pila podría parecer,
- Pila Anterior
- Parámetros
- (otros datos)
- memoria intermedia (50000 bytes)
- t (puntero sizeof)
En este punto , t está en la pila, y apunta al buffer, que también está en la pila. Cuando la función retorna, el tiempo de ejecución extrae todas las variables de la pila, que incluye t, el búfer y los parámetros. En su caso, devuelve el puntero t, por lo tanto haciendo una copia de él en la función de llamada.
Si la función de llamada y luego mira lo que t puntos a, se va a encontrar que que apunta a la memoria en la pila que puede o no existir.(El tiempo de ejecución lo sacó de la pila, pero los datos en la pila aún pueden estar allí por coincidencia, tal vez no).
La buena noticia es que no es inútil. Existen herramientas automatizadas que pueden buscar este tipo de errores en su software y reportarlos. Se llaman herramientas de análisis estáticas . Sentry es un ejemplo de un programa que puede informar este tipo de defecto .
Sí, estás en lo correcto. No debe devolver una matriz estática de una función. – AraK
@nvl Incluso si 't' se está asignando dinámicamente, se requeriría un operador de asignación sobrecargado para duplicar correctamente el búfer. – KevenK
No es una pérdida de memoria, solo "suerte de que funcione". Si la memoria que la matriz asignada en la pila se reutiliza, entonces tendrá basura en su matriz. Es una buena forma de crear errores oscuros. –