统计多维数组的第一维大小

3

现在我可以使用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();
}

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

4

让我们来看一个有趣的复杂例子。假设我们有

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

a的大小将为sizeof(char) * 10 * 20 * 30; 因此sizeof(a) = 6000 (C99标准)。 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*)作为基本因素,该因素将乘以每个维度的长度。指针类型的大小取决于您使用的机器/架构类型和编译器。
每个人使用不同的计算机和编译器,因此我们需要一个共同的参考来进行解释。在在线编译器中运行您的程序,结果为40 / 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。
现在你的输出结果,就像glglgl提到一样,有点不同(也许是你的机器或编译器的数据模型是16位); 与你运行它的机器和编译器相结合,似乎给出2作为char指针的大小,即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*)
希望能有所帮助!

我很难理解它,抱歉,你能否再详细解释一下?在我的情况下,我只有两个维度,第一个维度是5,第二个维度是2,你已经将20乘以30了,我理解。但是如果我只有var[0],那么没有地方可以将它乘以4,那个4从哪里来的? - Aesthetic
更新了答案以澄清您的特定问题。 - legends2k

2

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


2

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

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


var [0] 是包含两个 char* 的数组。其大小应为 8 或 16。 - pburka

1
"请问那个零是什么意思?" sizeof(var[0])询问第一维中元素的大小。零是任意但常规的。所有元素的大小相同。元素0是{"var0-0","var0-1"},一个包含两个指针的数组。在32位系统上其大小可能为8,在64位系统上则为16。元素1将是{"var1-0","var1-1"}等等。

0

你的回答帮了我很多,我得出了一个结论:我的第一维度的单个元素可能会因为我在位系统中使用的位数不同而被读取不同,但是值仍然成比例,我仍然会得到相同的值。


但我有一个问题,我如何知道第一维度每个元素有多少比特,我的意思是通过计算? - Aesthetic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接