【问题标题】:Trouble with scope: External variable not stored范围问题:未存储外部变量
【发布时间】:2011-05-02 16:44:45
【问题描述】:

当有人点击它时,我使用焦点回调来“删除” 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)));

【问题讨论】:

  • printf 可能正在打印到您的终端,该终端是行缓冲的。你可以试试printf("%s\n,store); 吗?

标签: c gtk scope


【解决方案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)

【讨论】:

  • 没有malloc就没有办法做到这一点吗?我宁愿首先 strcpy 字符串,但这会导致段错误。它现在工作正常,我设置了一个恒定的 malloc 大小(我知道这个特定文本条目的最大长度是 1 个字符) 同一个变量上的第二个 malloc 会导致问题吗?我应该在使用 malloc 之前释放变量还是连续两个 free() 也会导致问题?
  • @J V:哦,对了,如果它只有一个字符,那么你根本不需要指针。只是char store; ... store = gtk_entry_get_text(GTK_ENTRY(widget))[0]; ... printf("%c", store);
  • 文本条目返回一个字符数组(空终止符)是否可以取消引用gtk_entry_get_test()
  • @J V:确实。我之前评论中的代码 sn-p 获取第一个字符(参见[0]...)。
  • 对了!但是,后来的功能要求它是一个字符串。感谢您的帮助,让它工作(见主帖)
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 2011-06-01
  • 1970-01-01
  • 2023-03-04
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
相关资源
最近更新 更多