查找多维数组的大小

时间:2014-08-02 07:50:49

标签: c arrays sizeof

有没有办法找到多维数组的细节? I.E.一个[5] [3] [6]

我希望能够将它传递给函数以对内容进行一些基本操作,但是可以选择为函数提供一个,两个和三个Dim数组。这条路 我可以减少我的代码,只需添加额外的循环来执行额外的列。

我已经看过用于查找数组长度的代码,但它仅适用于单身人士。我想如果我要做一个sizeof()类型的调用它会给我整个总数,我需要一个列/行分解。

2 个答案:

答案 0 :(得分:6)

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;
}

结果:

  

dimx = 5,dimy = 3,dimz = 6

请注意,sizeof运算符会返回类型为size_t的结果,因此最好将其结果投射(以避免例如GCC中的-Wconversion标记警告)。如果您愿意,您可能还想创建类似函数的宏:

#define ARRAY_SIZE_3D_X(a) ((int) (sizeof a / sizeof a[0])
#define ARRAY_SIZE_3D_Y(a) ((int) (sizeof a[0] / sizeof a[0][0])
#define ARRAY_SIZE_3D_Z(a) ((int) (sizeof a[0][0] / sizeof a[0][0][0])

编辑:

正如@pmg所指出的,如果您更喜欢size_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;
}

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

答案 1 :(得分:3)

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

如果您以HPC中使用的“规范”方式表示多维数组(您使用一维数组并自行进行索引计算),则可以更容易地容纳具有可变数量维和大小的数组,如{{{ 3}},但是你仍然会遇到大小问题,你可以将它作为附加整数参数传递给你的函数,或者你可以将所有东西打包在一个结构中,例如:

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

this post详细介绍了处理密集三维矩阵的常用方法的索引计算和内存分配。