es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿printf() hace que el resto de una función aparentemente no relacionada funcione?

En la función a continuación, tengo un printf comentado. Cuando lo descomento, la función funciona perfectamente bien; cuando sigue comentado, la función parece acceder a la memoria aleatoriamente o cortarse aleatoriamente en el octavo carácter, en apariencia de manera errática. ¿Por qué esta situación de printf salva la función? Otros intentos de solución o depuración que he probado han fracasado.

char* temp(char* file, int max) {
    // Primero lee el archivo y obtén información
    FILE *r = fopen(file, "r");

    char text[max];
    char ch;
    int i = 0;

    while ((ch = fgetc(r)) != EOF) {
        text[i] = ch;
        i++;
    }
    // printf("%d",i);
    text[i] = '\0';
    // finaliza
    fclose(r);

    char *rt = text;
    return rt;
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la variable text declarada como una variable local dentro de la función temp. Cuando la función retorna, la memoria asignada para text es liberada y cualquier puntero que apunte a ella se vuelve inválido.

    Cuando se descomenta la instrucción printf, utiliza el valor de i, que resulta ser la longitud correcta de la cadena almacenada en text. Esto hace que el programa “funcione” porque deja de leer en text después de haber alcanzado el final del archivo.

    Una posible solución sería asignar memoria dinámicamente para text usando malloc y luego liberarla manualmente cuando ya no sea necesaria. Por ejemplo:

    char* temp(char* file, int max) {
        FILE *r = fopen(file, "r");
    
        char* text = (char*) malloc(sizeof(char) * (max+1)); // +1 para el terminador nulo
        if (text == NULL) {
            fclose(r);
            return NULL; // manejar error de falta de memoria
        }
    
        char ch;
        int i = 0;
    
        while ((ch = fgetc(r)) != EOF && i < max) { // detener la lectura después de max caracteres
            text[i] = ch;
            i++;
        }
        text[i] = '\0';
    
        fclose(r);
    
        return text;
    }
    

    De esta manera, text se almacena en el heap y permanece válido incluso después de que la función retorne.

Comments are closed.