【问题标题】:Declaring array twice (C99)两次声明数组(C99)
【发布时间】:2012-04-04 18:19:57
【问题描述】:

我是菜鸟,所以我会简短地说。以下是否合法(C99)?我不想一次存储多个数组。我可以创建一个具有最大所需长度的数组并只使用它的一部分,但我宁愿这样做。

int main(){
  double drm[15000];
  //do some stuff
  double drm[14000];  
  //do some other stuff
}

【问题讨论】:

    标签: arrays c99


    【解决方案1】:

    不,你不能那样做。它们需要位于不同的块中。你可以这样做:

    int main(void)
    {
      {
        double drm[15000];
        // do some stuff
      }
      {
        double drm[14000];
        // do some other stuff
      }
    }
    

    但是为什么不直接调用一个函数呢?即使您将它们放在不同的块中,您也无法真正保证编译器将针对存储执行什么操作。

    【讨论】:

    • 谢谢!我没有把它放在我的最小示例中,但这实际上是在 for(blah=0;blah
    • 是的 - 一个新块从有 { 的任何地方开始,并在匹配的 } 出现的地方结束。
    【解决方案2】:

    您可以使用mallocfree(或realloc,如果您不介意保留数据):

    #include <stdlib.h>
    int main(void)
    {
          double *drm = (double *)malloc(sizeof(double)*15000);
          //do stuff
          free(drm);
          drm = (double *)malloc(sizeof(double)*14000);
          //do other stuff
          free(drm);
    }
    

    【讨论】:

    • 不要转换 malloc() 的结果
    • @JacobAbrahams:这没什么。 void* 类型的表达式可以隐式转换为任何指针类型(除了指向函数的指针类型)。演员阵容很混乱,根据情况它可以掩盖错误。例如,在 C90 中,如果您忘记了 #include &lt;stdlib.h&gt;not &lt;malloc.h&gt;;这是非标准的),编译器将假定 malloc 返回 int;将结果转换为 double* 可能会导致生成不正确的代码。
    • @KeithThompson 如果我忘记了stdlib.h,编译器会假定返回类型为 int 类型,而我们会无意中将其转换为仍然不正确的指针。事实上,这种情况下编译器会产生“无法从 int 转换为 some*”的错误
    • 糟糕!看来C不介意somethingsomething*的转换!啊,我总是用 CPP 编译器运行 C 程序。我的坏:)
    • @PavanManjunath - 回复:您的第一条评论,当您忘记 stdlib.h 时,编译器会返回错误,如果您进行强制转换,您不会意识到这个错误 - 这就是我们不这样做的原因'不投:)
    【解决方案3】:

    由于数组与 C 中的指针密切相关,因此您也可以使用动态数组。首先,分配一个包含 15 000 个元素的新双精度数组。当您不再需要它时,将其删除。然后创建一个包含 14 000 个元素的新数组。

    不要忘记在使用数组后释放堆。人们往往会忘记这一点。此外,您应该检查分配是否成功。

    int main(void)
    {
        double *drm = 0;
        drm = (double*)malloc(15000 * sizeof(double));
        // do something
        free(drm);
        drm = (double*)malloc(14000 * sizeof(double));
        // do some other stuff
        free(drm); // don't forget me
    }
    

    不过,我同意 Carl Norum 的观点:改用函数。

    【讨论】:

    • 帖子被标记为C99,而不是C++。请更新您的示例以使用malloc()free()
    • 哦,抱歉,我可能把这两种语言混在一起了。我稍后会解决这个问题。
    • “因为数组是 C 语言中的指针” -- 不,它们肯定不是。阅读comp.lang.c FAQ 的第 6 节。你的malloc 电话最好写成drm = malloc(15000 * sizeof *drm);
    • 但它们密切相关,这就是我的意思。谢谢。
    • @DominikM.:那就这么说吧。你在传播一个普遍的误解。数组不是指针。 (而且您没有检查malloc() 是否成功。)
    猜你喜欢
    • 2011-10-05
    • 2011-07-04
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多