C - Struct maker函数会导致不同的错误

时间:2013-05-02 17:40:33

标签: c pointers struct

我有一个填充指向结构的指针的函数。当我用GTK回调填充它时,我使用全局指针,因此我正在使用的当前“nivel”可以从其他函数访问。我担心我可能会遇到一些记忆问题。

重点是,我相信记忆正在被“填满”。但是,只要程序退出调用函数来生成结构的函数,我就会得到以下结果之一:

1 - 错误: 检测到glibc 损坏的双链表

2 - 错误: 检测到glibc

3 - 分段错误。

4 - 完全没有错误。

错误从执行变为执行,所以有些东西告诉我它必须是内存,也许我没有正确处理结构的范围,但我找不到它的解决方案。不过,我很确定结构是正确的。任何帮助,将不胜感激。代码如下,它有一些西班牙语部分,但我评论了重要的部分。谢谢你的帮助!

//Struct, consists of a 2d array and size info.
struct nivel { 
    size_t filas;
    size_t columnas;
    int **mapa;
};

//Global current level pointer, I fill it with a call to the function within another function.

struct nivel *nivel_actual;

//Function to fill a struct, receives a pointer and the text file path.

    void    nuevo_nivel_desde_archivo(struct nivel * nuevo_nivel, char *nombre_archivo ){
    g_print("Leyendo archivo...\n");
    nuevo_nivel->filas = 0;
    nuevo_nivel->columnas = 0;
    int *caracter;
    int leyo_columnas = 0;
    g_print("Leyendo archivo...\n");
    g_print("Obteniendo columnas...\n");
    FILE *archivo = fopen(nombre_archivo, "r");
    while ( (caracter = fgetc(archivo)) != EOF )  {
         if ( (!(leyo_columnas)) )
            nuevo_nivel->columnas++;
         if ((caracter == '\n') & (!(leyo_columnas)))
            leyo_columnas = 1;
         else if ((caracter == '\n'))
            nuevo_nivel->filas++;
    }
    nuevo_nivel->filas++;
    nuevo_nivel->columnas--;
    g_print("Columnas %d , Filas %d\n", nuevo_nivel->columnas, nuevo_nivel->filas);
    fclose(archivo);

    int x;

    nuevo_nivel->mapa = malloc( sizeof( int ) * nuevo_nivel->filas );

    for( x = 0; x < nuevo_nivel->filas; x++ )
        nuevo_nivel->mapa[x] = malloc( sizeof( int ) * nuevo_nivel->columnas );

    //parsear caracteres dentro del archivo
    int i=0,j=0;
    archivo = fopen(nombre_archivo, "r");
    while((caracter = fgetc(archivo)) != EOF) { //encontrar numero de filas
        g_print("%c",caracter);
        switch ((int)caracter){
            case '\n': i++; j=0; break;
            case ' ':nuevo_nivel->mapa[i][j]=0; j++;break;
            case '*':nuevo_nivel->mapa[i][j]=1; j++;break;
            case '+':nuevo_nivel->mapa[i][j]=2; j++;break;
            case 'A':nuevo_nivel->mapa[i][j]=3; j++;break;
            case 'R':nuevo_nivel->mapa[i][j]=4; j++;break;
            case 'S':nuevo_nivel->mapa[i][j]=5; j++;break;
    }
    }

    fclose(archivo);
}

//Within this function is the call to the struct maker function.

static void abrir_archivo( GtkWidget *ventana1, gpointer datos){ 
 GtkWidget *ventana_sel;
 GtkWidget *ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 ventana_sel = gtk_file_chooser_dialog_new ("Seleccionar Archivo de Nivel",
                      GTK_WINDOW(ventana),
                      GTK_FILE_CHOOSER_ACTION_OPEN,
                      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
                      NULL);
 if (gtk_dialog_run (GTK_DIALOG (ventana_sel)) == GTK_RESPONSE_ACCEPT)
   {
     char *nombre_archivo;

     nombre_archivo = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ventana_sel));
     g_print(nombre_archivo);

//Here is the call

     nivel_actual = malloc (sizeof (struct nivel));
     nuevo_nivel_desde_archivo(nivel_actual,nombre_archivo);
     g_print("Archivo parseado...\n");
   }
 gtk_widget_destroy (ventana_sel);
}

1 个答案:

答案 0 :(得分:1)

nuevo_nivel->mapa是一个数组数组,因此需要分配一些int 指针

nuevo_nivel->mapa = malloc(sizeof(int*) * nuevo_nivel->filas);

如果您的平台上有sizeof(int) < sizeof(int*),那么您将在您已分配的内存结束之外写作。