范围问题:未存储外部变量

时间:2011-05-02 16:44:45

标签: c gtk scope

当有人点击它时,我正在使用焦点回调来“删除”GtkEntry的内容(如果他们将其留空,则将其放回,类似于堆叠上的问题标题)

但是,当函数像局部变量一样结束时,变量将被清空。

我在这里做错了什么?

// A place to store the character
char * store;

// When focussed, save the contents and empty the entry
void
use_key_entry_focus_in_event(GtkWidget *widget, GdkEvent *event, gpointer user_data){
    if(strcmp(gtk_entry_get_text(GTK_ENTRY(widget)), "")){
        store = (char *) gtk_entry_get_text(GTK_ENTRY(widget));
    }
    gtk_entry_set_text(GTK_ENTRY(widget), "");
}
void
othercallback(){
printf("%s",store); // Returns nothing
}

在answerers的帮助下编辑我写了这个(不需要malloc):

char store[2];
[...]
strcpy(store, (const char *) gtk_entry_get_text(GTK_ENTRY(widget)));

1 个答案:

答案 0 :(得分:1)

我对GTK库一无所知,但你的问题几乎可以肯定是你没有复制字符串,你只是复制它的地址。然后你用gtk_entry_set_text()替换字符串,这样原来的字符串就会消失。

您需要执行以下操作:

const char *tmp = (char *) gtk_entry_get_text(GTK_ENTRY(widget));
store = malloc(strlen(tmp)+1);
strcpy(store, tmp);

在某些时候要小心free(store)