如何在C语言中找到多维数组的维度

5

我声明了一个二维数组:

char *array[][3] = {
    {"a", "b", "c"},
    {"d", "e", "f"},
    {"u", "v", "w"},
    {"x", "y", "z"}};

我该如何找到第一个维度?

2个回答

11

sizeof数组/ sizeof数组[0]

示例:*

#include <stdio.h>

int main(void) {
  int array[4];

    printf("%zd\n", sizeof array / sizeof array[0]);
    printf("%zd\n", sizeof (int));
    printf("%ld\n", (long)(sizeof array / sizeof array[0]));
    return 0;
}


*如果操作数是type-name,即使sizeof是运算符而不是函数,你仍需要括号。但在C语法中出现type-name的每个地方(声明符不使用该产生式),都需要在其周围加上括号。由于在用于各种C规范的半正式语法中没有单独的类型名括在括号中的产生式,因此它们在定义sizeofgeneric-associationscast-expressions等事物的产生式中指定了所需的括号。但这些括号实际上是为了能够解析表达式语法中的类型而存在的。它们是“类型表达式”的一部分语法,但由于这些东西的有限使用,它们实际上没有任何这样的产生式或术语。


如果您在C89中使用%d,则还应使用int强制转换。 - Jonathan Leffler
True,或使用%ld并转换为long。我实际上已经进行了无数次更改以消除64位系统上的警告。应该提到它。 - DigitalRoss
3
如果sizeof运算符的操作数是表达式,那么在操作数周围加上括号是没有必要的(这种情况下的括号只是表达式中的一部分)。但是,如果sizeof运算符的操作数是一个类型,则需要使用括号。 - Michael Burr
3
即使在使用表达式作为sizeof操作数时,我个人喜欢加上括号,这样我就不必担心记住sizeof运算符的优先级。我很难记住除法和乘法比加法和减法先执行这一点以上的内容。 - Michael Burr
1
@DigitalRoss - (int) 不是一个表达式。在 sizeof 的类型操作数周围需要使用括号的要求是因为标准这样规定:C99 的 6.5.3.4/2(sizeof 运算符),“sizeof 运算符产生其操作数的大小(以字节为单位),其可以是一个表达式或一个用括号括起来的类型名称。” - Michael Burr
显示剩余2条评论

4
为什么不提供:
sizeof(array) / sizeof(char*) / 3

一次调用?

假设你知道数据类型(char*)和其他维度(3),你需要将结构体的大小除以每个元素的大小以得到总元素数,然后再除以第一个维度,从而得到第二个维度。

另外:我的原始答案使用了'sizeof("a")',当然是错误的,因为它是数组的大小(2,即'a'和'\0'),而不是指针的大小(在我那可怕过时的32位机器上为4)。但我喜欢我得到那个错误答案的两个赞 - 你们这些家伙在投票前真的不检查答案吗? :-)


与DigitalRoss的解决方案相比,这不是一个非常优雅的解决方案。你必须对类型有相当多的了解才能写出来。是的,人们确实会在没有检查答案或发现答案问题的情况下进行点赞。 - Jonathan Leffler

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