ďťż
 
 
   malloc struktury i segmentation fault
 
 

Tematy

 
    
 

 

 

 

malloc struktury i segmentation fault





szuwar7 - 04-03-2010 11:09
Mam taki mały problem. Używam malloca w ,,main'' w ten sposób: MyWidgets              *widgets;
widgets = g_slice_new (MyWidgets);

widgets->settings=g_malloc(sizeof(SSH_Settings));
widgets->settings->id_rsa_dir=(gchar*)g_malloc(sizeof(gchar)*256); Później chcę użyć free i jeszcze raz malloca w funkcji: void *read_conf_file(void *args)
{
        MyWidgets              *widgets;
        widgets = (MyWidgets *)args;

        g_free(widgets->settings);
        g_free(widgets->settings->id_rsa_dir);

        widgets->settings=g_malloc(sizeof(SSH_Settings));
        widgets->settings->id_rsa_dir=(gchar*)g_malloc(sizeof(gchar)*256);
} Wywołanie funkcji read_conf_file w main: read_conf_file(widgets); struktura MyWidgets

typedef struct
{     
        GladeXML                *gxml;
        GtkWidget              *window2;
        GtkWidget                *window;
        GtkWidget              *entry;
        GtkWidget              *setting_entry_id_rsa;
        GtkWidget              *setting_entry_login;
        GtkWidget              *setting_entry_ssh_config;
        GtkWidget              *textview;
        GtkWidget                *radio1;
        GtkWidget                *radio2;
        GtkWidget                *radio3;
        GtkWidget                *radio4;
        GtkWidget                *radio5;
        GtkWidget                *radio6;
        GtkWidget                *toggle1;
        GtkWidget                *toggle2;
        GtkWidget                *toggle3;
        GtkWidget                *toggle4;
        GtkWidget                *toggle5;
        GtkWidget                *toggle6;
        GtkWidget                *toggleButton;
        GtkWidget                *progress_bar;
        GtkWidget                *connection;
        SSH_Settings                *settings;
        gchar                        *filename;
        GError                  *error;
       
} MyWidgets; struktura SSH_Setting

typedef struct
{     
        gchar                        *id_rsa_dir;
        gchar                        *login;
        gchar                        *ssh_config_dir;

       
} SSH_Settings; Podczas wywołania malloca po raz pierwszy w main wszystko działa jak należy. Gdy wywołuje funkcję read_conf_file funkcje free i malloc dla struktury SSH_Settings nie powoduje błędu. Dopiero ta linijka: widgets->settings->id_rsa_dir=(gchar*)g_malloc(sizeof(gchar)*256); Powoduje powstanie błędu segmentation fault. Jak temu zaradzić? Skąd bierze się ten akurat przy tym wywołaniu?



mlyczek - 04-03-2010 13:11
Nie mam pomysłu na to, czemu akurat podana przez Ciebie linjka powoduje błąd, ale spróbuj na początek może w funkcji read_conf_file zamienić poniższe dwie linijki miejscami
        g_free(widgets->settings);
    g_free(widgets->settings->id_rsa_dir); bo najpierw zwalniasz pamięć, w której jest cała struktura settings, a potem chcesz zwolnić pamięć wskazywaną przez element tej struktury (konkretnie przez settings->id_rsa_dir), ale tego wskaźnika już tam nie ma. W zasadzie to właśnie ta linijka powinna spowodować błąd.

Spróbuj je zamienić miejscami, może to coś pomoże.



szuwar7 - 09-03-2010 08:50
Probowalem tego tez, ale dalej nie dziala. Napisalem juz ten program bez malloca, ale ciekawe skad ten blad.



godlark - 10-03-2010 15:37
Zainteresuj się programem valgrind, uruchamiasz go "valgrind nazwa_programu", wskazuje wycieki pamięci. Tylko najpierw skompiluj program z opcją -ggdb.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • minister.pev.pl

  •  

     


     

     
    Copyright 2003. MĂłj serwis