获取C中的二维数组长度

时间:2016-06-08 14:32:46

标签: c arrays pointers multidimensional-array

如果有人知道的话,我只需要一个明确的答案 我已经检查了类似的问题,但没有一个澄清多维数组中发生的事情。所以,

typedef u_char block[16];
block *array = (block*) somePointer;

我正在尝试将 bytes 的流读取为块数组 同样,每个元素的大小都只有1个字节,所以不要试图让我更加混淆我的尺寸和元素 我假设(希望)变量array已成为块数组。

array[n][16];

如何确定n ??的值?有限吗?

一些测试表明:

sizeof(array) == 4;        // n != sizeof (array)
sizeof(*array) == 16;        // n != sizeof (*array)

2 个答案:

答案 0 :(得分:1)

TL / DR版

您将无法使用n变量计算单个表达式中的array。指向T的指针仅指向T的单个实例;它无法知道该实例是否是T数组的第一个元素。

长版

鉴于声明

typedef u_char block[16];
block *array = (block*) somePointer;

以下是真的:

   Expression        Type           
   ----------        ----           
        array        block * == u_char (*)[16]  // pointer to 16-element array of u_char
       *array        block   == u_char [16]     
 sizeof array        size_t  == sizeof (block *) == sizeof (u_char (*)[16]) == 4 // on your system                   
sizeof *array        size_t  == sizeof (block)   == sizeof (u_char [16])    == 16 

假设声明如

block someArray[10];

然后someArrayu_char的10x16数组。您可以通过

确定someArray中的行数
sizeof someArray / sizeof *someArray

这将someArray(160)中的总字节数除以someArray(16)的单行中的字节数,为您提供行数(10)。

但是,如果你写

block *array = someArray;

然后您无法使用someArray变量确定array中的行数。 sizeof array返回指针的大小,而不是指向的东西,sizeof *array返回u_char的16个元素数组的大小,而不是someArray的大小。

所以当你写了

block *array = (block*) somePointer; // what is the type of somePointer,
                                     // and is the cast really necessary?

您将array设置为指向block单个实例。您无法从指针本身确定block中有多少somePointer行。

您可以使用sentinel值(类似于字符串中的0终止符)以某种方式标记最后一行(例如,如果该行的所有元素都设置为0或255或其他某种模式):

#define TERMINATOR 255
...
bool lastRow( block *b )
{
  bool result = true;
  for ( size_t i = 0; i < sizeof *b; i++ )
    result = result && (b[i] == TERMINATOR);
  return result;
}

int main( void )
{
  ...
  block *array = (block *) somePointer;
  ...
  size_t count = 0;
  while ( !lastRow( array++ ) )
    count++;
  ...
}

当然,这仅在所有255(或0或其他值)的行不是有效数据时才有效。否则,您需要手动跟踪somePointer的大小。

答案 1 :(得分:0)

指向array的指针的大小。它指向数组的第一个元素:

sizeof(array) == 4;

这是array指向的数组的大小,即第一个元素(长度为16的数组):

sizeof(*array) == 16;

n必须是有限的。 C中没有无限数组。 n的值必须在使用前定义。