es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La tabla hash de Glib tiene tamaño 0 después de la inserción.

Me di cuenta de que llamar a g_hash_table_insert en una tabla hash globalmente definida no añade ningún elemento a la tabla hash:


#define GNU_SOURCE #include <glib.h> #include <stdio.h> GHashTable* ht; void f(void *p) { g_hash_table_insert(ht,"A",p ); g_hash_table_insert(ht,"b",p ); g_hash_table_insert(ht,"c",p ); } int main() { GHashTable* ht = g_hash_table_new(g_str_hash, g_str_equal); int i = 3; f(&i); printf("=> %d \n", g_hash_table_size(ht)); return 0; }

El resultado es:

(process:23035): GLib-CRITICAL **: 22:04:13.945: g_hash_table_insert_internal: afirmación 'hash_table != NULL' fallida

(process:23035): GLib-CRITICAL **: 22:04:13.945: g_hash_table_insert_internal: afirmación 'hash_table != NULL' fallida

(process:23035): GLib-CRITICAL **: 22:04:13.946: g_hash_table_insert_internal: afirmación 'hash_table != NULL' fallida
=> 0

¿Cómo puedo evitar este problema y qué indican las afirmaciones fallidas? ¿Cómo puede la tabla hash ser igual a NULL después de ser definida?

Compilé el programa con:

gcc -O0 `pkg-config --cflags --libs glib-2.0` -g -Wall -Wextra -std=c11 -pedantic -o /tmp/a a.c</stdio.h></glib.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema es que la variable global ht está siendo definida pero no inicializada, por lo que tiene el valor NULL por defecto. Al llamar g_hash_table_insert(ht,"A",p );, se intenta insertar en una tabla hash que es NULL, lo cual resulta en un fallo de la aserción.

    Para evitar este problema, la variable global ht necesita ser inicializada antes de usarla. Esto se puede hacer llamando a g_hash_table_new(g_str_hash, g_str_equal) y asignándola a ht en el alcance global.

    Las aserciones que fallaron nos indican que la función g_hash_table_insert_internal espera un puntero de tabla hash no NULL, pero en su lugar recibe un puntero NULL. Esto hace que la función falle y genere un error de aserción.

    En este caso específico, la tabla hash es NULL porque no fue correctamente inicializada. Es importante asegurarse siempre de inicializar correctamente cualquier variable global antes de usarla en el programa.

Comments are closed.