2013-05-02 52 views
0

我有一个函数,填充指针结构。当我用GTK回调填充它时,我使用全局指针,因此我使用的当前“nivel”可以从其他函数访问。恐怕我可能有一些内存问题。C - 结构制造商功能导致不同的错误

重点是,我相信内存是“充满”好的。但是,只要程序失控调用该函数,使结构的功能,我得到一些成果之一:

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

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

nuevo_nivel->mapa = malloc(sizeof(int*) * nuevo_nivel->filas); 
如果 sizeof(int) < sizeof(int*)你的平台上

,你会写超出了内存的末尾,你已分配。

+0

太棒了:-) ...简直不能相信一个简单的*大部分时间都会让我付出沉重的代价。非常感谢!!! – dhcarmona 2013-05-02 17:49:26