【问题标题】:Count multi-dimensional array's first dimension计算多维数组第一维
【发布时间】:2013-10-24 13:16:38
【问题描述】:

现在我可以使用var_num=sizeof(var)/sizeof(var[0]); 计算第一个维度,顺便说一下我已经研究过并在我的代码中使用它,但问题是我不知道它是如何工作的,在我的输出中它显示20 / 4 = 5我不知道那个 20 和 4 是从哪里来的,我只想问sizeof(var)sizeof(var[0]) 是如何获取这些值的,那个零是什么意思,它是指第一个还是二次元?

#include <stdio.h>
#include <conio.h>
void main(){
char *var[][2]={
        {"var0-0","var0-1"},
        {"var1-0","var1-1"},
        {"var2-0","var2-1"},
        {"var3-0","var3-1"},
        {"var4-0","var4-1"},
        };
int var_num=sizeof(var)/sizeof(var[0]);
clrscr();
printf("%d / %d = %d",sizeof(var),sizeof(var[0]),var_num);
getch();
}

【问题讨论】:

  • 这些值令人难以置信。我在 32 位机器上得到 40 / 8 = 5。 40 是总大小,8 是一个条目的大小(这是一个char * [2],所以我的第一个维度中有 5 个元素。如果你在单行上做同样的事情,你会得到 8 / 4 = 2,因为一行包含2 个条目,每个条目 4 个字节。
  • 在 64 位机器上,结果分别为 80 / 16 = 516 / 8 = 2.
  • 也许你的输出来自你的程序的前一个版本,它在数组中少了一个维度。
  • 你确定这是你得到的输出吗?在我的系统上,我得到40 / 8 = 5(32 位模式)或80 / 16 = 5(64 位模式)。

标签: c arrays pointers sizeof


【解决方案1】:

为了好玩,我们举一个复杂的例子。假设我们已经

char a[10][20][30] = { };

a 的大小将为sizeof(char) * 10 * 20 * 30;所以sizeof(a) = 6000 (as per C99 standard)。 a 可以看作是一个由 (10) 个数组组成的数组,由 (20) 个 (30) 个字符组成的数组组成。现在

  • a[0] 将小一维,为我们提供一个由 (20) 个 (30) 个字符组成的数组
  • a[0][0] 会给我们一个 (30) 个字符的数组
  • a[0][0][0] 是一个字符。

在所有这些示例中,0 只不过是相应数组级别的第一个元素。

现在通过sizeof(a)/sizeof(a[0]) 查找数组的长度是根植于上述逻辑的技巧。 sizeof(a[0]) 只不过是 20 个 30 个字符的数组的大小,即 600。sizeof(a) / sizeof(a[0]) = 6000/600 = 10,返回第一个维度的长度。对于更高的维度也可以进行类似的数学运算。

由于在您的问题中,您有一个指针类型 char* sizeof(char*) 应该被视为将乘以每个维度的长度的基本因子。指针类型的大小取决于机器/架构类型和您使用的编译器。


我们每个人都会有不同的机器和不同的编译器在上面运行,所以我们需要一个共同的参考来解释。在online compiler gives the result40 / 8 = 5 中运行您的程序。正如我上面所说,根据平台和编译器,指针类型的大小会有所不同。

就像您在评论中所写,您的数组是char* [5][2] 类型。使用[0] 进行延迟将删除一个级别,我们有char* [2];因此sizeof(var[0]) = sizeof(char* [2]) = 8,假设两个字符指针的大小为 8,这意味着该在线机器上的sizeof(char*) 为 4。在此基础上sizeof(var) = 4 * 5 * 2 = 40,这就是我们在输出中看到的,因此正确地将第一个数组长度设为 5。

现在你的输出,比如mentioned by glglgl,有点不同(也许你的机器或编译器的数据模型是16位的);你运行它的机器和你的编译器似乎给 2 作为一个字符指针的大小,即sizeof(char*) = 2。现在当你做var[0],我们已经char* [2];它的大小等于sizeof(char*) * 2 = 2 * 2 = 4。同样sizeof(var) = 2 * 5 * 2 = 20。因此你有20 / 4 = 5作为输出。

我的意思是通过计算,我怎么知道第一维的每个元素有多少位?

char* [5][2] 中,第一个维度的每个元素都是char* [2] 类型,因此它的大小是2 * sizeof(char*)

希望对你有帮助!

【讨论】:

  • 我很难理解对不起,请你进一步解释一下,在我的情况下,我只有 2 维,我的第 1 维是 5,第 2 维是 2,你还有乘以 20到 30 我明白了,但是如果我只有我的 var[0] 就没有地方可以乘以它 4 是从哪里来的?
  • 更新了答案以澄清您的特定问题。
【解决方案2】:

20 是数组的大小(以字节为单位),4 是数组中单个元素的大小(以字节为单位)。数组具有相同类型的所有元素,因此具有相同的大小,因此您可以通过将其大小除以单个元素的大小来获得其长度。您不必使用第 0 个元素,也可以使用任何其他元素(如果您确定存在具有此类索引的元素)。

【讨论】:

    【解决方案3】:

    var[0]char ** 类型,因此它是一个指针。在 32 位系统上,地址占用 4 个字节,因此指针的大小为 4。

    sizeof(var) 等于 20,因为 char ** 类型的数组中有 5 个元素。

    【讨论】:

    • var[0] 是一个由两个 char*s 组成的数组。它的大小应该是 8 或 16。
    【解决方案4】:

    “这个零是什么意思?”

    sizeof(var[0]) 询问第一维中元素的大小。零是任意的,但很传统。所有元素都具有相同的大小。元素 0 是 {"var0-0","var0-1"},一个由两个指针组成的数组。它的大小在 32 位系统上可能是 8,在 64 位系统上可能是 16。元素 1 将是 {"var1-0","var1-1"} 等。

    【讨论】:

      【解决方案5】:

      您的回答非常有帮助,我得出的结论是,我的第一个维度的单个元素的读取方式可能不同,具体取决于我使用的位系统,其中位可能更大或更小,但值将保持比例和我仍然会得到相同的价值。

      【讨论】:

      • 但是我有一个问题,我的意思是通过计算,我怎么知道我的第一个维度的每个元素有多少位?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多