以C为单位获取二维数组的长度

以C为单位获取二维数组的长度,c,arrays,pointers,multidimensional-array,C,Arrays,Pointers,Multidimensional Array,如果有人知道,我只需要一个明确的答案。 我已经检查了类似的问题,但没有一个能澄清多维数组中发生了什么。所以 typedef u_char block[16]; block *array = (block*) somePointer; 我试图将字节流读取为块数组。 同样,每个元素的大小正好是1字节,所以不要试图用大小和元素来混淆我。 我假设(希望)变量array已成为一个块数组 array[n][16]; 如何确定n的值??它是有限的吗 一些测试表明: sizeof(array) == 4;

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

typedef u_char block[16];
block *array = (block*) somePointer;
我试图将字节流读取为块数组。
同样,每个元素的大小正好是1字节,所以不要试图用大小和元素来混淆我。
我假设(希望)变量
array
已成为一个块数组

array[n][16];

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

一些测试表明:

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

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

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

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

TL/DR版本

您将无法使用
数组
变量在单个表达式中计算
n
。指向
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];
然后
someArray
是一个10x16的
u\u char
数组。您可以通过以下方式确定
someArray
中的行数

sizeof someArray / sizeof *someArray
这将
someArray
(160)中的总字节数除以
someArray
(16)中单个行中的字节数,得到行数(10)

然而,如果你写

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

所以当你写信的时候

block *array = (block*) somePointer; // what is the type of somePointer,
                                     // and is the cast really necessary?
array
设置为指向
block
的单个实例。您无法从指针本身确定
somePointer
中有多少行
block

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

#定义终止符255
...
布尔拉斯特罗(b区)
{
布尔结果=真;
对于(大小i=0;i

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

sizeof(pointer)==4
(32位,您已打开)和
sizeof(char[16])==16
…为什么我不感到惊讶?“我假设(希望)变量数组已成为块数组。”-如果指针是数组,它将不会被称为“pointer”,而是“array”!它甚至不指向二维阵列。请学习这些基础知识。关于如何声明2D数组,这里有足够多的问题(注意:它不像
int**array;
-这是初学者的另一个错误概念!如果1)它不是必需的,或者2)你不理解所有含义,或者3)不完全接受它们,就永远不要使用它!“如何确定
n
的值?”——
n
我假设(希望)变量数组已经变成了块数组。
。。。数组不是指针,反之亦然。总的来说,你是对的,但我不认为这是问题的答案。:)如何确定n的值??它是有限的吗?你能在我的回答中找到这些问题的答案吗?我感谢你的努力
somePointer
u\u char*
。这指向通过网络捕获的字节流。我已经了解到,数据的长度取决于您要查找的内容(当然还有捕获长度)。
block *array = (block*) somePointer; // what is the type of somePointer,
                                     // and is the cast really necessary?
#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++;
  ...
}