【发布时间】:2014-01-24 08:36:45
【问题描述】:
在我用 c 语言(使用 gtk)制作的窗口应用程序中,我首先必须创建一个指向我发送给回调函数的指针的指针。
由于我将指针发送到另一个函数,我认为我必须在堆上为其分配内存:
GtkWidget **entry;
entry = malloc(5 * sizeof(GtkWidget));
entry[0] = entry_a;
entry[1] = entry_s;
entry[2] = entry_t;
entry[3] = entry_v;
entry[4] = entry_r;
GtkWidget 变量是一个局部变量
但是有人告诉我这不是必需的,因为它可以被声明为静态
static GtkWidget *entry[5];
正确 - 程序使用静态 GtkVidget 指针代替。我的问题是为什么和什么这个静态在这个上下文中意味着什么?
【问题讨论】:
-
视情况而定。变量是在函数内部,还是在源文件中是全局变量(不是任何函数的一部分)?
-
只是一个不相关的简短说明,您可能是指
sizeof(GtkWidget*)吗? -
@cobbal - 不,如上所示 - sizeof(GtkWidget)
-
@user3155478 我相信@cobbal 试图告诉你你可能有一个错误(即可能分配了太多内存)。此外,如果
static在函数范围之外使用,则意味着声明仅对您所在的翻译单元(文件)可见。如果它在函数内部,static表示数据分配在不同的位置通过不同的函数调用来持久化您的数据。 -
如果要为5个指针的数组分配空间,则需要分配5倍于指针类型的大小。在这种情况下,指针类型是
GtkWidget*,因此您需要malloc(5 * sizeof(GtkWidget*))而不是malloc(5 * sizeof(GtkWidget))。避免此类错误的成语是:entry = malloc(5 * sizeof *entry)