Gtk gchar标签

时间:2013-02-22 06:24:23

标签: c gtk

当我尝试运行以下代码段时,我不断收到此错误和奇怪的胡言乱语:

错误是:

(foo:11333):Pango-WARNING **:传递给pango_layout_set_text的无效UTF-8字符串()

结构定义:

typedef struct chat_info ChatInfo;
struct chat_info {
  GtkWidget *text_line1;
  GtkWidget *text_line2;
  GtkWidget *text_line3;
  GtkWidget *entry;

};

这段代码在第三个标签上出现了奇怪的乱码(第二个标签是空的)

static void send_message(GtkWidget *window, gpointer data){
    GuiInfo *g = (GuiInfo *) data;


    ChatInfo *c = g->chat;

    const gchar *message = gtk_entry_get_text(GTK_ENTRY(c->entry));  
    const gchar *oldtext1 = gtk_label_get_text( (GtkLabel *) c->text_line1);
    const gchar *oldtext2 = gtk_label_get_text( (GtkLabel *) c->text_line2);

    gtk_label_set_text( (GtkLabel *) c->text_line1, message);
    gtk_label_set_text( (GtkLabel *) c->text_line2, oldtext1);
    gtk_label_set_text( (GtkLabel *) c->text_line3, oldtext2);


}

我查了一下错误,我猜它可能是因为当我应该给gchar字符串时给出一个指针地址?一切看起来都是正确的。

1 个答案:

答案 0 :(得分:4)

我认为问题在于,_get_text()来自GtkLabel来电回复的内存被_set_text()释放,然后再拨打gtk_label_set_text(c->text_line1, message)再次使用它。

例如,当您调用oldtext1时,您检索到的gtk_label_get_text()指针无效(对gtk_label_set_text( (GtkLabel *) c->text_line3, oldtext2); gtk_label_set_text( (GtkLabel *) c->text_line2, oldtext1); gtk_label_set_text( (GtkLabel *) c->text_line1, message); 的调用会返回指向字符串内部副本的指针)。

现在,您可以通过重新排序代码来解决此问题,以消除该依赖关系:

strdup()

或者为了便于阅读,您应该_get_text()_set_text()获取字符串,然后将其传递到{{1}}并稍后将其释放。