【问题标题】:declare array once C声明数组一次 C
【发布时间】:2015-04-25 19:57:16
【问题描述】:

如果我有一个被多次调用的函数,并且该函数需要一个包含 16 个指针的数组,每次调用时都会使用新指针进行更新,那么这是声明该数组的正确方法吗?

char** readUserInput() {
    static char* cmds[16];
    ...

}

这个数组会被初始化一次吗?

【问题讨论】:

  • 只要不在声明时初始化数组,就运行时性能而言并没有真正的区别。如果数组是静态的,那么它在数据部分中分配。否则,它在堆栈中分配。但在任何一种情况下,分配(也称为“静态分配”,但不要将其与此处的关键字 static 混淆)不会添加任何可执行代码,因此不会产生任何运行时影响。
  • 如果你在声明时初始化数组AND它是非静态的,那么初始化代码会隐式添加到函数中,并且每次函数都会执行叫做。当然,这影响运行时性能。
  • 请注意,我上面提到的分配细节(数据部分与堆栈)不是由 C 语言标准规定的,而是取决于编译器实现(尽管我的每个编译器听说过以同样的方式实现它)。

标签: c arrays memory static


【解决方案1】:

是的,静态变量只初始化一次。通过声明变量cmds,您声明了一个包含16 个char*s 的数组。数组初始化为零。数组将永远不会被再次初始化。

以这段代码为例:

int i;
static char *cmds[5];
for (i = 0;i<5;++i) {
  printf("%d ", cmds[i]);
}

打印出来:

0 0 0 0 0

【讨论】:

  • 我认为你应该指出,在c声明!=初始化/定义。
  • @BenjyKessler:这样一来,您已经使这个答案过时且无关紧要。此外,您的编辑完全是错误的并且错过了 OP 的意图,因为数组在给定的代码 sn-p 中 未初始化。 OP 使用了“声明”这个词,因为这就是他或她正在做的事情——只是声明,而不是初始化。这个答案解释了 OP 对“声明”这个词的理解有什么问题,所以通过编辑这个问题,你基本上毁了你自己的答案。我认为您应该恢复您的更改。
【解决方案2】:

它只声明一次,无论它是否包含static 存储说明符。不要将 declarelifetime 混淆。

如果真正的问题是“cmds 是否只有 一个 实例,并且其内容会在两次调用之间持续存在吗?”,那么是的。它使用static 存储类说明符声明。根据 C11 标准的 §6.2.4.3

...它的生命周期是程序的整个执行过程,它的存储值仅在程序启动之前初始化一次。”

【讨论】:

    【解决方案3】:

    静态变量只初始化/声明一次,静态关键字有助于为整个程序提供生命周期,但会限制它们的范围。

    【讨论】:

      【解决方案4】:

      尚不清楚您是否必须从热函数中返回该数组。如果是,它必须是静态的或必须作为参数传递。即使不是,那么静态数组和自动数组之间的“速度”也没有区别,因为您的重用方案无论如何都应该在调用之前具有 [可能无操作] 预初始化的方法,无论第一个初始值是什么。

      静态存储的缺点是代码变得不可重入。将其作为参数传递将是更正确的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        • 2020-02-15
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 1970-01-01
        相关资源
        最近更新 更多