【问题标题】:How to calculate size of an external array?如何计算外部数组的大小?
【发布时间】:2016-02-09 14:23:37
【问题描述】:

有人知道如何从外部文件计算数组的大小吗?

考虑:

数据.c
float arr[]={1.4, 2.3, 7.6, 4.8, 3.3};
Main.c
#include <stdio.h>

int main()
{
extern float arr[];
//...
}

那我该怎么走呢?我尝试过使用sizeofsize_t,但这两种方法仍然存在错误。

【问题讨论】:

  • 发布代码时请使用代码格式。
  • 有什么阻止你使用std::vector
  • @dhke:我不认为可能的重复确实是重复,因为它是关于另一种语言的。
  • 根据您的文件名,我会说您的代码是 C,而不是 C++。
  • @molbdnilo:代码是有效的 C++,并且被标记为 C++(或者更确切地说,在您更改之前被标记为 C++)。有些人对 C++ 源文件使用“.c”文件扩展名。有些人不知道文件扩展名的重要性。

标签: c arrays sizeof


【解决方案1】:

在您的 main.c 文件中,编译器拥有的唯一信息是 extern float arr[];,这不包括大小。

因此,要么您尝试在 Data.c 中定义一个返回 sizeof(arr) 的函数(在此编译单元中,大小应该是已知的),或者,当您标记问题 c++ 时,您使用 std::array 固定大小或std::vector 用于可变大小。

【讨论】:

    【解决方案2】:

    问题在于extern float arr[] 是一个不完整类型,它只说“在其他地方,有一个名为arr 的数组,大小未知”。如果大小已知,则只能使用sizeof,例如extern float arr[5]

    但是,您不应该编写这样的程序。对非常量变量使用extern 总是表明程序设计不佳。

    相反,您应该使用私有封装,并且所有对变量的访问都应该通过 setter/getter 函数来完成。同样,您可以创建一个函数get_size(),它返回数组大小。

    【讨论】:

      【解决方案3】:

      简短的回答是,你不能做你想做的事。当你说

      extern float arr[];
      

      编译器根本无法获取该外部数组的大小。

      简单的解决方法是使用第二个带有数组大小的全局变量:

      数据.c

      float arr[]={1.4, 2.3, 7.6, 4.8, 3.3};
      int arrsz = sizeof(arr) / sizeof(arr[0]);
      

      Main.c

      extern float arr[];
      extern int arrsz;
      

      如需额外积分,请使用size_t arrsz 而不是int

      不过,正如其他一些答案所指出的那样,像这样的全局变量风格很差,尤其是在“真实”程序中。对于一些更高级、更简单的修复,请参阅其他答案。

      【讨论】:

        猜你喜欢
        • 2018-08-26
        • 2010-10-17
        • 2016-02-09
        • 2017-04-29
        • 1970-01-01
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多