我有一个函数可以填充指向结构的指针。当我用 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);
}