Проблема с областью действия: внешняя переменная не сохранена - PullRequest
0 голосов
/ 02 мая 2011

Я использую обратные вызовы фокуса для «удаления» содержимого 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
}

Редактировать с помощью ответчиков Я написал это (не нужно malloc):

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

1 Ответ

1 голос
/ 02 мая 2011

Я ничего не знаю о библиотеке 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) в какой-то момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...