GTK +를 배우기 때문에이 간단한 응용 프로그램을 실행할 때마다 충돌이 발생합니다.GTK gtk_label_set_text 분할 오류
주 창에 레이블을 만들고 단추를 클릭 할 때마다 (key_press_event
) 레이블과 제목을 바꿔야합니다.
change_title
함수에서 gtk_label_set_text
을 주석 처리하면 제목이 올바르게 바뀌고 응용 프로그램이 충돌하지 않습니다. gtk_label_set_text
이 내 앱을 왜 크래킹합니까?
#include <gtk/gtk.h>
#include <string.h>
const gchar first[]="FIRST";
const gchar last[]="LAST";
static void destroy(GtkWidget *window,gpointer data)
{
gtk_main_quit();
}
static gboolean change_title(GtkWidget *widget,GtkLabel *data)
{
if(strcmp(last,gtk_window_get_title(GTK_WINDOW(widget)))){
gtk_window_set_title(GTK_WINDOW(widget),last);
gtk_label_set_text(data,first);
} else {
gtk_window_set_title(GTK_WINDOW(widget),first);
gtk_label_set_text(data,last);
}
return FALSE;
}
int main(int argc,char **argv)
{
GtkWidget *window, *label;
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),last);
gtk_widget_set_size_request(window,300,100);
g_signal_connect(window,"destroy_event",G_CALLBACK(destroy),NULL);
label = gtk_label_new("caasdasdjadnjadjahadjad");
gtk_container_add(GTK_CONTAINER(window),label);
g_signal_connect(window,"key_press_event",G_CALLBACK(change_title),GTK_LABEL(label));
gtk_widget_show_all(window);
gtk_main();
return 0;
}
편집는 : 나는 GDB를 사용하여 문제를 발견, 라벨 포인터는 change_title
기능이 제대로 전달되지 않습니다. 나는 이유를 모른다. (예는 : change_title()
레이블 main()
라벨 = 0xb6406608
= 0x807bda8
에서)
예를 들어 확인해 보셨습니까? 디버거에서 모든 변수가 괜찮습니까? 'NULL' 포인터가 없습니까? –