Historia de la pregunta
El operador return apareció en C para finalizar explícitamente la ejecución de una función y devolver un resultado al código que la llamó. En los lenguajes de programación más antiguos, no siempre existía la posibilidad de devolver valores, y el mecanismo return permitió indicar explícitamente el resultado de los cálculos. Esto mejoró la expresividad y la seguridad de los programas.
Problema
La tarea principal: finalizar correctamente la función y, si es necesario, devolver un valor correspondiente a un tipo determinado. Los errores a menudo ocurren debido a la devolución de un valor de tipo incorrecto, punteros a variables no existentes o locales, o la ignorancia del valor devuelto por la parte que llama.
Solución
Ejemplo de código:
#include <stdio.h> struct Point { int x, y; }; struct Point make_point(int x, int y) { // devolviendo estructura (copia) struct Point p = {x, y}; return p; } int* dangerous() { int num = 42; return # // peligroso: devolviendo la dirección de una variable local! } void do_nothing() { return; // correcto para funciones de tipo void } int main() { struct Point p = make_point(3, 4); printf("%d %d\n", p.x, p.y); int* ptr = dangerous(); // UB: ptr apunta a una área destruida }
Características clave:
¿Se puede usar return en funciones sin valor (void)?
Respuesta: Sí, se puede escribir "return;" para funciones void, pero no se puede indicar una expresión (return x;) para una función void.
¿Qué sucede al devolver un array desde una función?
Respuesta: En C no se puede devolver un array directamente. Solo se puede devolver un puntero (por ejemplo, a un array estático), pero a menudo es mejor devolver un puntero y su tamaño o usar un array dinámicamente asignado.
int* make_arr() { static int arr[5] = {1,2,3,4,5}; return arr; // el array estático vive después de salir de la función }
¿Por qué es peligroso devolver un puntero a una variable local?
Respuesta: Después de salir de la función, la memoria para la variable local se libera (área de pila). Usar el puntero devuelto lleva a un comportamiento indefinido.
Caso negativo
La función devuelve un puntero a una variable local, el llamador recibe "basura", comportamiento impredecible y errores aleatorios flotantes.
Ventajas:
Desventajas:
Caso positivo
Uso de una estructura devuelta (se copia por valor) o devolver un puntero a memoria estática/dinámica:
Ventajas:
Desventajas: