GLib:无法初始化 GValue [...] 该值已被初始化为“(空)”

GLib: cannot initialize GValue [...] the value has already been initialized as '(null)'

我使用 GValue:

发现了非常奇怪的行为

此代码运行良好:

#include <gtk/gtk.h>
int
main(int argc, char *argv[])
{
  gtk_init(&argc, &argv);

  {
    GValue value;
    g_value_init (&value, G_TYPE_STRING);
    g_value_set_string (&value, "hallo");
    gchar * strVal = g_strdup_value_contents (&value);
    g_print ("gvalue: %s\n", strVal);
    free (strVal);
    g_value_unset (&value);
  }
  return 0;
}

但是,以下代码在 标记的行 中产生警告 cannot initialize GValue with type 'gchararray', the value has already been initialized as '(null)'

注意,唯一改变的是新块,里面还有另一个 GValue

#include <gtk/gtk.h>
int
main(int argc, char *argv[])
{
  gtk_init(&argc, &argv);

  {
    GValue value;
    g_value_init (&value, G_TYPE_STRING);
    g_value_set_string (&value, "hallo"); // warning spawns here
    gchar * strVal = g_strdup_value_contents (&value);
    g_print ("gvalue: %s\n", strVal);
    free (strVal);
    g_value_unset (&value);
  }
  {
    GValue value2;
    g_value_init (&value2, G_TYPE_INT);
    g_value_set_int (&value2, 15);
    gchar * strVal = g_strdup_value_contents (&value2);
    g_print ("gvalue: %s\n", strVal);
    free (strVal);
    g_value_unset (&value2);   
  }
  return 0;
}

谁能告诉我这是怎么回事?

您未正确初始化 GValue

GValue value = G_VALUE_INIT;

块范围内未初始化的变量有一些垃圾值,可能碰巧无效并触发断言(或者可能碰巧有效但没有任何反应)。