当我尝试运行以下代码段时,我不断收到此错误和奇怪的胡言乱语:
错误是:
(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字符串时给出一个指针地址?一切看起来都是正确的。
答案 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}}并稍后将其释放。