C 求多维数组的大小

C 求多维数组的大小,c,arrays,sizeof,C,Arrays,Sizeof,有没有办法找到多维数组的细节?即a[5][3][6] 我希望能够将它传递给一个函数,以便对内容进行一些基本操作,但可以选择向函数1、2和3 Dim数组提供数据。这边 我可以将代码简化为只添加额外的循环来执行额外的列 我看过查找数组长度的代码,但它只适用于单数。我假设如果我要执行sizeof()类型调用,它将给出整个总数,其中我需要列/行细分。C中的多维数组只是数组的数组,因为您可以在每个子数组之间检查sizeof,如下所示: #include <stdio.h> int main(

有没有办法找到多维数组的细节?即a[5][3][6]

我希望能够将它传递给一个函数,以便对内容进行一些基本操作,但可以选择向函数1、2和3 Dim数组提供数据。这边 我可以将代码简化为只添加额外的循环来执行额外的列


我看过查找数组长度的代码,但它只适用于单数。我假设如果我要执行sizeof()类型调用,它将给出整个总数,其中我需要列/行细分。

C中的多维数组只是数组的数组,因为您可以在每个子数组之间检查
sizeof
,如下所示:

#include <stdio.h>

int main(void)
{
    int a[5][3][6];
    int dimx, dimy, dimz;

    dimx = (int) (sizeof a / sizeof a[0]);
    dimy = (int) (sizeof a[0] / sizeof a[0][0]);
    dimz = (int) (sizeof a[0][0] / sizeof a[0][0][0]);

    printf("dimx = %d, dimy = %d, dimz = %d\n", dimx, dimy, dimz);

    return 0;
}
编辑: 正如@pmg所指出的,如果您更喜欢直接输入
size\u t
类型,请使用以下内容:

#include <stdio.h>

int main(void)
{
    int a[5][3][6];
    size_t dimx, dimy, dimz;

    dimx = sizeof a / sizeof a[0];
    dimy = sizeof a[0] / sizeof a[0][0];
    dimz = sizeof a[0][0] / sizeof a[0][0][0];

#if __STDC_VERSION__ >= 199901L
    printf("dimx = %zu, dimy = %zu, dimz = %zu\n", dimx, dimy, dimz);
#else
    printf("dimx = %lu, dimy = %lu, dimz = %lu\n", (unsigned long) dimx,
           (unsigned long) dimy, (unsigned long) dimz);
#endif

    return 0;
}
#包括
内部主(空)
{
INTA[5][3][6];
尺寸(dimx、dimy、dimz);
dimx=a的大小/a的大小[0];
dimy=a[0]/a[0][0]的大小;
dimz=sizeof a[0][0]/sizeof a[0][0][0];
#如果STDC版本=199901L
printf(“dimx=%zu,dimy=%zu,dimz=%zu\n”,dimx,dimy,dimz);
#否则
printf(“dimx=%lu,dimy=%lu,dimz=%lu\n”,(无符号长)dimx,
(无符号长)dimy,(无符号长)dimz);
#恩迪夫
返回0;
}

请注意,由于通常的算术转换,在单个表达式(例如,
int
unsigned long
)中混合有符号值和无符号值是有问题的,因为如果无符号类型的秩大于或等于有符号类型,则有符号值将提升为unsigned,例如,
-5
现在是一个大整数。

基本上没有确定传递给函数的可变大小数组的维数的有用方法。作为参数传递的数组名会衰减为指针,函数中的
sizeof
只会给出相应类型指针的大小,而不是原始数组的大小

如果您以HPC中使用的“规范”方式表示多维数组(您使用1D数组并自己进行索引计算),则可以更容易地适应不同数量的维度和大小的数组,如中所述,但仍然存在大小问题,您可以将其作为附加整数参数传递给函数,也可以将所有内容打包到结构中,例如:

typedef struct {
    int *data;
    int nx;
    int ny;
    int nz;
} matrix3;

处理密集3D矩阵的常用方法的索引计算和内存分配在中有详细描述。

好答案:-)出于好奇:为什么不使用
count()
?性能?@peter_the_oak:AFAIK C语言没有
count()
函数(如C++中的函数)。至少在C99/C11两个草案中都没有关于它的参考。您可以将
dimx
dimy
dimz
声明为
size\u t
,并且在C99中,使用
“%zu”
打印值(在C99之前,您需要使用eg
“%lu”
)——并且去掉作业中不必要的难看的石膏。所以我理解你是如何决定尺寸的,一旦我明白了,就非常简单了。然而,正如Emmet和alk所指出的,它是一个传递给函数的指针,因此该方法在我的函数中不起作用(?),而只在我的main中起作用。@ChefFlambe:没错,这里有几种方法,例如,您可以将这些维度作为附加函数的参数传递(作为三个整数,或者作为带它们的struct)。正如我在上面的评论中所写的,基本上这种多维数组必须作为
int(*a)[3][6]
类型传递,因此只能省略
5
。当然,这完全取决于您希望如何将数组传递给函数,以及如何分配(堆栈上的编译时,使用
malloc
alloca
、VLA等)。接收数组的函数无法确定其大小。无论它已声明到哪个维度。请参见此处:@alk:但是请注意,此类数组必须有效地传递,例如
int(*a)[3][6]
,因为只有最左边的大小可以省略。
typedef struct {
    int *data;
    int nx;
    int ny;
    int nz;
} matrix3;