通过引用与C和GTK +混淆?

时间:2015-04-16 13:44:28

标签: c gtk gtk2

我正在尝试使用GTK +创建一个非常简单的UI。我想我遇到了一些与C和pass-by-reference相关的问题。

以下是我的主要代码:

...
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都是有效的,但我不确定。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

解决方案是通过引用传递指针,遗憾的是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");
相关问题