Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [C] chiusura di un file testuale - errore in esecuzione

    Salve a tutti il seguente programma compila senza errori e in esecuzione mi dà il seguente errore (segmentation fault):
    Errore:
    Codice PHP:
    Last loginFri Nov  5 09:15:38 on ttys000
    MacBook
    -Pro-di-Tommaso-Ricci:~ zorgatonecd ~/Doc*/work*
    MacBook-Pro-di-Tommaso-Ricci:workspace zorgatonels
    Hello        Prova        TestEclipse2
    Helloc
    ++    TestEclipse    canopen
    MacBook
    -Pro-di-Tommaso-Ricci:workspace zorgatonecd canopen
    MacBook
    -Pro-di-Tommaso-Ricci:canopen zorgatonels
    Debug        canopen
    .c
    MacBook
    -Pro-di-Tommaso-Ricci:canopen zorgatonecd Debug
    MacBook
    -Pro-di-Tommaso-Ricci/Debug zorgatonels
    canopen        canopen
    .o    objects.mk    subdir.mk
    canopen
    .d    makefile    sources.mk
    MacBook
    -Pro-di-Tommaso-Ricci/Debug zorgatone$ ./canopen
    Insert filename
    makefile
    makefile can be opened
    Segmentation fault
    MacBook
    -Pro-di-Tommaso-Ricci/Debug zorgatone
    Programma:
    Codice PHP:
    /*
     * canopen.c
     *
     *  Created on: 05/nov/2010
     *      Author: zorgatone
     */

    #include <stdio.h>
    #include <stdlib.h>

    int main(void) {

        
    typedef charstring;

        
    FILE *fp;
        
    string str;

        
    fprintf(stdout"Insert filename: ");
        
    fscanf(stdin"%s"str);

        
    fp fopen(str"r");
        if (
    fp == NULL) {
            
    fprintf(stdout"%s can't be opened\n"str);
            exit(
    EXIT_FAILURE);
        }
        
    fprintf(stdout"%s can be opened\n"str);
        
    fclose(fp);

        return 
    0;


    l'errore è legato alla funzione fclose(), se la tolgo funziona tutto ma mi sepreste dire perchè si verifica l'errore??

    Grazie a tutti in anticipo!
    Zorgatone.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    "str" è un puntatore a char per il quale non hai allocato spazio. Fallo e non avrai problemi.
    every day above ground is a good one

  3. #3
    Ti sbagli str (dopo la chiamata alla fscanf()) contiene il nome del file che verrà aperto e collegato a fp!! E per questo che non mi spiego il segmentetion fault nella chiamata alla fclose()...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Hai provato ad allocare spazio per str? Una soluzione banale:

    codice:
    ...
    typedef char string[256];
    ...
    vedi come va. Per inciso, a me crasha subito dopo la fscanf().
    every day above ground is a good one

  5. #5
    Come vedi nel mio output invece crasha dopo avermi detto se il file è stato aperto o meno e quindi alla fine... io rimuovendo fclose(fp); riesco a farlo girare senza crash e sarebbe la soluzione però mi scoccia non sapere il motivo esatto per cui mi dà l'errore per questo mi serviva il parere di un buon programmatore C...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Mi dai la soddisfazione di fare quella (e solo quella) modifica che ti ho indicato e vedere se il programma crasha ancora? Almeno provaci prima di dire che non è così.
    every day above ground is a good one

  7. #7
    Originariamente inviato da Zorgatone
    Come vedi nel mio output invece crasha dopo avermi detto se il file è stato aperto o meno e quindi alla fine... io rimuovendo fclose(fp); riesco a farlo girare senza crash e sarebbe la soluzione però mi scoccia non sapere il motivo esatto per cui mi dà l'errore per questo mi serviva il parere di un buon programmatore C...
    Anche se tu dirai cento volte che la colpa è di fclose, resta il fatto che l'errore è nell'uso di str senza avere allocato la relativa memoria. Il fatto che il problema emerga solo quando chiami la fclose è un puro caso.

    Fare un typedef char * string non trasforma un semplice puntatore ad un array di caratteri in una stringa come è intesa in linguaggi di più alto livello, in C devi sempre e comunque gestirti da te la memoria
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Scusa capisco quello che mi stai dicendo ma il puntatore char*, puntando alla primo carattere dell'input utente può essere passato alla funzione fprintf con conversione %s e non mi ha mai dato errori.... si chiama stringa allocata dinamicamente mi pare ma non ho il bisogno di allocare memoria tanto la fprintf avanza di carattere in carattere finchè trova \0 .... e poi se guardi il mio output vedi che la stringa funziona a dovere e viene scritta correttamente dalla fprintf e quindi fscanf ha funzionato.... non dovrebbe darmi problemi in realtà, qualcuno può confermare???

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Scrivendo

    codice:
    typedef char* string;
    string str;
    non stai allocando niente, stai solo dichiarando un puntatore a carattere (a voler essere pignoli, stai allocando staticamente spazio per un puntatore a carattere). Se vuoi ricorrere all'allocazione dinamica devi utilizzare le funzioni apposite (malloc() e calloc()), oppure ricorri all'allocazione statica riscrivendo la typedef, ad esempio, come ti ho mostrato sopra. Dichiarare semplicemente un puntatore non comporta l'allocazione di spazio in memoria (che poi di quanto dovrebbe essere se non lo specifichi?).

    Il fatto che il programma ti crashi sulla fclose() è casuale (ti ripeto, il tuo programma sulla mia macchina, col mio sistema e col mio compilatore crasha immediatamente dopo la fscanf()), se proprio vuoi sapere cosa succede nello specifico armati di un debugger serio e mettiti ad analizzare la situazione dei registri del processore man mano che il tuo programma viene eseguito. Si chiama buffer overflow.
    every day above ground is a good one

  10. #10
    beh in realtà se l'input utente è: makefile
    ... e come dichiarare: char * str = "makefile";
    e di conseguenza str punta a m, poi a me funziona fino a quel punto, appena sarò sul mio computer proverò con il vostro consiglio ma rimango scettico...
    MacBook-Pro-di-Tommaso-Ricci/Debug zorgatone$ ./canopen
    Insert filename: makefile
    makefile can be opened
    Segmentation fault
    MacBook-Pro-di-Tommaso-Ricci/Debug zorgatone$

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.