2

我正在使用一个以这种方式创建多维数组的库:

const unsigned short arrayA[5] = {1, 2, 3, 4, 5};
const unsigned short arrayB[3] = {7, 8, 9};

const unsigned short *multiArray[] ={arrayA, arrayB};

我得到了它的值并且它有效:

printf("03: %d\n", multiArray[0][3]); //4
printf("12: %d\n", multiArray[1][2]); //9

当我需要获取任何数组的大小时,问题就来了,我试过这个:

printf("Size of first array: %ld \n", sizeof(multiArray[0])/sizeof(multiArray[0][0]));

它返回 2,可能是因为它使用了地址。

那我怎样才能得到数组的大小呢?

我必须这样做,尽量不改变数组的声明方式,所以数组已经存在,我只需要获取大小。

有什么办法吗?

4

6 回答 6

4

无法推断 multiArray 中的指针指向的数组的大小,因为无法执行任何计算,因为两个数组(arrayA 和 arrayB)将存储在任意位置。一个好的做法是存储数组的大小。

于 2013-02-13T09:51:04.510 回答
2

你不能。您必须提前知道数组的大小并将其作为附加参数传递。

于 2013-02-13T09:43:57.890 回答
2

如果你sizeof在一个指针上做,你会得到实际指针的大小,而不是它指向的大小。您必须以其他方式跟踪包含数组的大小。

于 2013-02-13T09:47:53.563 回答
2

可以获得矩阵的行数和列数:

int main(void) {
     int row;
     int column;
     int matrix[4][5]={{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}};

     row=sizeof(matrix)/sizeof(matrix[0]); 
     column=sizeof(matrix[0])/row;

     printf("row %i \n",row);
     printf("column %i \n",column);
     return 0;
}
于 2014-08-16T04:09:52.057 回答
1

你不能!您应该保存这些数据并将其传递到您需要的任何地方。

顺便说一句,当你这样做时:sizeof(multiArray[0])/sizeof(multiArray[0][0])
你基本上sizeof(<pointer>)/sizeof(<unsigned short>)在你的特定机器上做 => 2 。

于 2013-02-13T09:56:52.673 回答
1

正如其他人所说,您不能,而是可以构建自己的类型:

#include <stdio.h>

struct cont {
    const unsigned short *value;
    size_t len;
};

int main(void)
{
    const unsigned short arrayA[5] = {1, 2, 3, 4, 5};
    const unsigned short arrayB[3] = {7, 8, 9};

    struct cont arrays[] = {
        {arrayA, sizeof(arrayA) / sizeof(arrayA[0])},
        {arrayB, sizeof(arrayB) / sizeof(arrayB[0])},
    };

    printf("03: %d\n", arrays[0].value[3]);
    printf("12: %d\n", arrays[1].value[2]);


    printf("Size of first array: %ld \n", arrays[0].len);

    return 0;
}
于 2013-02-13T10:09:36.690 回答