在我用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指针代替。我的问题是为什么和 这个静态在这个上下文中意味着什么?
答案 0 :(得分:0)
具有static
存储类的所有变量都将具有程序执行生命周期和内部链接;但是,它的范围取决于它的声明位置。
要解决您提出的问题,是否使用static
数组或malloc
数组确实必须根据具体情况确定。但是,在大多数情况下,内存很便宜,因此您不必担心性能问题,除非您的数组大小过大(int
数组大小为5是无关紧要的)。保护阵列的完整性更令人担忧。这就是为什么,根据经验,你应该使变量的范围尽可能小。
答案 1 :(得分:0)
他们做不同的事情。
如果使用malloc
分配数组(或任何对象),则在调用malloc
时在运行时分配该内存,并且它将一直存在直到free
它(即,将malloc
返回的指针值传递给free
函数。 (realloc
也可以释放malloc
ed空格,但这与此无关。)
如果使用static
关键字定义数组对象,则该对象在程序的整个运行时间内都存在。
static
关键字的含义因其出现的位置而异。在本地声明(在函数内),它为对象提供静态存储持续时间,这意味着它存在于程序的整个执行中,而不是在函数返回时被释放。这意味着它可以在调用函数时保留其先前的值。在任何函数外定义的对象已经具有静态存储持续时间;在这种情况下,static
关键字会更改其链接,因此从其他源文件中看不到它。
哪个更好,静态分配还是malloc
?没有更多信息就不可能说出来。
malloc
更灵活。它将通过返回空指针来报告分配失败;如果你声明一个太大的静态对象,你的程序很可能会崩溃。但是,对于只有5个指针的数组,您可能不需要担心(尽管如此,您应该总是检查malloc
返回的值)。
定义static
对象只允许为每个名称定义一个对象。 malloc
允许您构建动态结构。它还允许您在运行时决定数组需要多少元素。
第三种方法是在一些函数定义中本地定义一个对象,而不使用static
关键字。在这种情况下,对象将仅存在于该函数内部(或甚至在块内),并且在函数返回时将自动释放。
在不知道你将如何处理指针数组的情况下,我们无法告诉你应该如何声明和分配它。如果你可以在某个函数中将它声明为局部变量,那么你可能应该这样做。如果你不能,那么,不要。