我正在尝试创建函数,而不是在main中有一堆代码,但我无法做到这一点,因为我对函数做错了,这是我的代码看起来像:
void static notebook(GtkWidget *table, GtkWidget *notebook) {
notebook = gtk_notebook_new();
...
attaching table to notebook
...
}
int main(int argc, char *argv[]) {
GtkWidget *table;
GtkWidget *notebook;
...
notebook(table, notebook);
...
}
有人可以指出我的问题并帮我解决一下吗?
答案 0 :(得分:3)
问题似乎是你假设参数既是函数的输入也是输出。但在C中,函数参数始终是副本。所以当你这样做时:
void static notebook(GtkWidget *table, GtkWidget *notebook) {
notebook = gtk_notebook_new();
您正在修改notebook
指针的本地副本,而不是main
中的指针。 <{1}}中的notebook
指针仍然未初始化。
要做你尝试的,最小的改变是:
main
但是用每个指针做这件事都很丑陋而且很麻烦。所以我建议进行一些重构:
void static notebook(GtkWidget **table, GtkWidget **notebook) {
*notebook = gtk_notebook_new();
...
int main() {
GtkWidget *table;
GtkWidget *notebook;
...
notebook(&table, ¬ebook);
类型的单个值。这样的事情:
struct whatever
答案 1 :(得分:0)
以param "GtkWidget *table"
为例,您只需将指针参数传递给函数,并为其分配内存:table = new xxx
。
但GtkWidget *table
这里是一个临时参数只存在于函数笔记本中,没有办法可以影响main中的实参。在{&#34;笔记本电脑&#34;之后,GtkWidget *table
,GtkWidget *notebook
的值保持不变功能完成。
所以你可以在笔记本功能的声明中使用指针指针,就像这个
void static notebook(GtkWidget **table) {
*table = new gtk_notebook_new();
}
然后在main中,调用如下:
int main(int argc, char *argv[]) {
GtkWidget *table;
notebook(&table);
...
}
应该这样做。