【问题标题】:Pass by reference confusion with C and GTK+?通过引用与 C 和 GTK+ 混淆?
【发布时间】:2018-01-06 17:02:38
【问题描述】:

我正在尝试使用 GTK+ 制作一个非常简单的 UI。我想我遇到了一些与 C 和传递引用有关的问题。

这是我的主要代码:

...
GtkWidget *controlArea;
GtkWidget *sendButton;
GtkWidget *createAccountButton;
GtkWidget *textBox;
...
controlArea = create_control_area(sendButton, createAccountButton, textBox);
...
g_signal_connect(sendButton, GTK_CALLBACK(send), textBox);
g_signal_connect(createAccountButton, GTK_CALLBACK(createAccount), NULL);
...

下面是create_control_area()函数的一些代码:

...
textBox = gtk_text_view_new();
...
sendButton = gtk_button_new_with_label("Send Message");
createAccount = gtk_button_new_with_label("Create Account");
...

文本视图和按钮附加到一个小部件,然后由该函数返回。我的两个回调方法都存在但当前为空。当我运行该程序时,我在g_signal_connect() 调用上遇到了段错误(它们中的任何一个都会这样做)。我在 gdb 中进行了测试,它似乎表明所有三个小部件 textBox、sendButton 和 createAccount 都是有效的,但我不确定。有什么想法吗?

【问题讨论】:

  • “有效”是什么意思?如果你的意思是一个值!= 0 他们仍然可以包含垃圾......
  • 嗯,好点。他们指出了看似正常(不是 100% 确定标准是什么)的位置,如果我不给它们一个回调函数,它们就会正确显示在 UI 上。如何测试 main 内部的指针是否仍然正确?
  • C 不知道 “按引用传递”,它按值传递所有内容。您传递的值可以是值本身(int、char 或其他类型),也可以是值的内存地址(指针,也可以按值传递)

标签: c gtk gtk2


【解决方案1】:

您遇到的问题是您传递给函数的指针是按值传递的,即它们被复制并更改函数内部指针的本地副本当然不会更改原始指针。

解决方案是通过引用传递指针,遗憾的是 C 不支持这种方式,但可以使用指针来模拟。所以你必须在调用函数时使用address-of操作符&来传递一个指向指针的指针:

controlArea = create_control_area(&sendButton, &createAccountButton, &textBox);

当然,您必须修改函数以获取指向指针的指针,并在分配指针时使用解引用运算符*

*textBox = gtk_text_view_new();
...
*sendButton = gtk_button_new_with_label("Send Message");
*createAccount = gtk_button_new_with_label("Create Account");

【讨论】:

  • 谢谢!这正是我所需要的,我只是无法在脑海中仔细考虑。
  • 我会反过来说:它是通过使用指针的指针来模拟的引用。
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 2018-12-27
  • 2022-01-19
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
相关资源
最近更新 更多