【问题标题】:Using static instead of malloc - C-language使用静态而不是 malloc - C 语言
【发布时间】: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)

标签: c pointers static malloc


【解决方案1】:

所有具有static 存储类的变量都将具有程序执行生命周期和内部链接;但是,它的范围取决于它的声明位置。

为了解决您提出的问题,是否使用static 数组或malloc 数组确实必须根据具体情况确定。但是,在大多数情况下,内存很便宜,因此您不必担心某种方式的性能问题,除非您的数组大小变得过大(int 数组大小为 5 相当微不足道)。保护阵列的完整性更值得关注。这就是为什么根据经验,您应该使变量的范围尽可能小。

【讨论】:

    【解决方案2】:

    他们做不同的事情。

    如果您使用malloc 分配一个数组(或任何对象),则在调用malloc 时会在运行时分配该内存,并且它会继续存在直到free 它(即,传递返回的指针值通过mallocfree 函数)。 (realloc 也可以释放malloced 空间,但这与这里无关。)

    如果您使用 static 关键字定义数组对象,则该对象在程序的整个运行期间都存在。

    static 关键字的含义根据其出现的位置而有所不同。在本地声明(函数内部)上,它为对象提供静态存储持续时间,这意味着它在程序的整个执行过程中都存在,而不是在函数返回时被释放。这意味着它可以在对函数的调用中保留其先前的值。在任何函数之外定义的对象已经具有静态存储持续时间;在这种情况下,static 关键字会更改其链接,因此它在其他源文件中不可见。

    哪个更好,静态分配还是malloc?如果没有更多信息,就不可能说出来。

    malloc 更灵活。它将通过返回一个空指针来报告分配失败;如果你声明一个太大的静态对象,你的程序很可能会崩溃。不过,对于只有 5 个指针的数组,您可能不需要担心这一点(尽管如此,您应该始终检查malloc 返回的值)。

    定义static 对象仅允许您为每个名称定义一个对象。 malloc 可让您构建动态结构。它还可以让您在运行时决定一个数组需要多少元素。

    第三种选择是在本地定义一个对象,在某个函数定义中,不使用static 关键字。在这种情况下,该对象将仅存在于该函数内部(甚至存在于一个块内部),并在函数返回时自动释放。

    在不知道您将如何处理指针数组的情况下,我们无法告诉您应该如何声明和分配它。如果您可以在某个函数中将其声明为局部变量,那么您可能应该这样做。如果你做不到,那就不要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 2021-01-16
      相关资源
      最近更新 更多