2013-02-13 94 views
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,可能是b因为它使用地址。

我该如何获得数组的大小呢?

我不得不这样做,试图不改变数组的声明方式,所以数组已经在那里,我只需要获得大小。

任何方法?

+0

arrayA和arrayB不应该是指向数组恕我直言。 – 2013-02-13 09:44:21

+0

对不起,有一个错字,现在修复 – 2013-02-13 09:45:09

回答

4

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

2

你不行。您必须事先知道数组的大小,并将其作为附加参数传递。

2

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

+0

@AntonioMG你不能。只要你松开原始数组的轨迹(通过使用指向它的指针,或者将它传递给函数等),编译器也会松散地跟踪它对数组的元数据,比如它尺寸。 – 2013-02-13 09:50:22

1

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

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

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